Поиск всех совпадений регулярных выражений сделает это:
input=r'"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
re.findall('".+?"', # or '"[^"]+"', input)
Это вернет список имен файлов:
["Y:\DATA\00001\SERVER\DATA.TXT", "V:\DATA2\00002\SERVER2\DATA2.TXT"]
Чтобы получить имя файла без кавычек, используйте:
[f[1:-1] for f in re.findall('".+?"', input)]
или использовать re.finditer
:
[f.group(1) for f in re.finditer('"(.+?)"', input)]
Я знаю, что это получило ответ миллион лет назад, но это тоже работает:
input = '"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
input = input.replace('" "','"').split('"')[1:-1]
Должен вывести его как список, содержащий:
['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']
Я думаю, что вы хотите извлечь файловые пути, которые разделены пробелами. То есть вы хотите разделить строку на элементы, содержащиеся в цитатах. Т.е. с линией
"FILE PATH" "FILE PATH 2"
Вы хотите
["FILE PATH","FILE PATH 2"]
В этом случае:
import re
with open('file.txt') as f:
for line in f:
print(re.split(r'(?<=")\s(?=")',line))
С file.txt
:
"Y:\DATA\00001\SERVER\DATA MINER.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"
Выходы:
>>>
['"Y:\\DATA\\00001\\SERVER\\DATA MINER.TXT"', '"V:\\DATA2\\00002\\SERVER2\\DATA2.TXT"']
Я просто добавлю, что если вы имели дело с строками, которые выглядят так, как будто они могут быть параметрами командной строки, то вы могли бы воспользоваться shlex module :
import shlex
with open('somefile') as fin:
for line in fin:
print shlex.split(line)
Давал бы:
['Y:\\DATA\\00001\\SERVER\\DATA.TXT', 'V:\\DATA2\\00002\\SERVER2\\DATA2.TXT']
shlex
может вам помочь.
import shlex
my_string = '"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
shlex.split(my_string)
Это коснется
['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']
Нет регулярного выражения, без разделения, просто используйте csv.reader
import csv
sample_line = '10.0.0.1 foo "24/Sep/2015:01:08:16 +0800" www.google.com "GET /" -'
def main():
for l in csv.reader([sample_line], delimiter=' ', quotechar='"'):
print l
Выходной сигнал
['10.0.0.1', 'foo', '24/Sep/2015:01:08:16 +0800', 'www.google.com', 'GET /', '-']
Мой вопрос Python - Ошибка, вызванная пробелом в argv Arument , была отмечена как дубликат этого. У нас есть несколько книг на Python, которые возвращаются к Python 2.3. Самое старое упоминалось в списке для argv, но без примера, поэтому я изменил вещи на: -
repoCmd = ['Purchaser.py', 'task', repoTask, LastDataPath]
SWCore.main(repoCmd)
и в SWCore на: -
sys.argv = args
Shlex модуль работал, но я предпочитаю это.
Это было мое решение. Он анализирует самые нормальные входные данные точно так же, как если бы он был передан непосредственно в командную строку.
import re
def simpleParse(input_):
def reduce_(quotes):
return '' if quotes.group(0) == '"' else '"'
rex = r'("[^"]*"(?:\s|$)|[^\s]+)'
return [re.sub(r'"{1,2}',reduce_,z.strip()) for z in re.findall(rex,input_)]
Случай использования: сбор пучка сценариев одиночного выстрела в утилиту запуска без необходимости повторного ввода команды .
Edit: Got OCD о глупом способе, которым командная строка обрабатывает дрянные цитаты и написала следующее:
import re
tokens = list()
reading = False
qc = 0
lq = 0
begin = 0
for z in range(len(trial)):
char = trial[z]
if re.match(r'[^\s]', char):
if not reading:
reading = True
begin = z
if re.match(r'"', char):
begin = z
qc = 1
else:
begin = z - 1
qc = 0
lc = begin
else:
if re.match(r'"', char):
qc = qc + 1
lq = z
elif reading and qc % 2 == 0:
reading = False
if lq == z - 1:
tokens.append(trial[begin + 1: z - 1])
else:
tokens.append(trial[begin + 1: z])
if reading:
tokens.append(trial[begin + 1: len(trial) ])
tokens = [re.sub(r'"{1,2}',lambda y:'' if y.group(0) == '"' else '"', z) for z in tokens]
Вы должны выйти из "
:
input.split("\"")
приводит к
['\n',
'Y:\\DATA\x0001\\SERVER\\DATA.TXT',
' ',
'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT',
'\n']
Чтобы удалить полученные пустые строки:
[line for line in [line.strip() for line in input.split("\"")] if line]
приводит к
['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']