Python разделяет строку на кавычки

Я ученик-питон. Если у меня есть строки текста в файле, который выглядит так:

"Y: \ DATA \ 00001 \ SERVER \ DATA.TXT" "V: \ DATA2 \ 00002 \ SERVER2 \ DATA2.TXT"

Могу ли я разделить линии вокруг перевернутых запятых? Единственной константой была бы их позиция в файле относительно самих линий данных. Линии данных могут варьироваться от 10 до 100 + символов (они будут вложенными сетевыми папками). Я не вижу, как я могу использовать любой другой способ, чтобы эти маркеры могли разделиться, но моя нехватка знаний на питоне затрудняет это. я пробовал

optfile=line.split("") 

и другие варианты, но продолжайте получать значениеerror: empty seperator. Я понимаю, почему это так, я просто не знаю, как это изменить. Любая помощь, как всегда, очень ценится.

Большое спасибо

9 Solutions collect form web for “Python разделяет строку на кавычки”

Поиск всех совпадений регулярных выражений будет делать это:

 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.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'] 

Я просто добавлю, что если бы вы имели дело с строками, которые выглядят так, как будто они могут быть параметрами командной строки, то вы могли бы воспользоваться модулем shlex :

 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'] 

Нет регулярного выражения, без разделения, просто используйте 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 /', '-'] 

Я думаю, что вы хотите извлечь файловые пути, которые разделены пробелами. То есть вы хотите разделить строку на элементы, содержащиеся в цитатах. Т.е. с линией

 "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"'] 

Это было мое решение. Он анализирует наиболее нормальный ввод точно так же, как если бы он был передан в командную строку напрямую.

 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: Получил 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] 

модуль 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'] 

Ссылка: https://docs.python.org/2/library/shlex.html

Я знаю, что это ответили миллион лет назад, но это тоже работает:

 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'] 

Мой вопрос Python – Ошибка, вызванная пространством в argv Arument, была отмечена как дубликат этого. У нас есть несколько книг на Python, которые возвращаются к Python 2.3. Самое старое упоминалось об использовании списка для argv, но без примера, поэтому я изменил вещи на: –

 repoCmd = ['Purchaser.py', 'task', repoTask, LastDataPath] SWCore.main(repoCmd) 

и в SWCore для: –

 sys.argv = args 

Модуль shlex работал, но я предпочитаю это.

Python - лучший язык программирования в мире.