Python - ошибка, вызванная пробелом в argv Arument [дубликат]

6
задан Jon Clements 9 September 2013 в 23:26
поделиться

9 ответов

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

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)]
3
ответ дан Thomas Jung 27 August 2018 в 13:22
поделиться

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

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']
0
ответ дан D'Arcy 27 August 2018 в 13:22
поделиться

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

"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"']
0
ответ дан HennyH 27 August 2018 в 13:22
поделиться

Я просто добавлю, что если вы имели дело с строками, которые выглядят так, как будто они могут быть параметрами командной строки, то вы могли бы воспользоваться 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']
3
ответ дан Jon Clements 27 August 2018 в 13:22
поделиться
Модуль

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

1
ответ дан Kashif Siddiqui 27 August 2018 в 13:22
поделиться

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

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

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

и в SWCore на: -

sys.argv = args

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

-1
ответ дан OldSteve 27 August 2018 в 13:22
поделиться

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

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]
0
ответ дан Redsplinter 27 August 2018 в 13:22
поделиться

Вы должны выйти из ":

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']
8
ответ дан user 27 August 2018 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: