Python разбить строку по разделителю, только он находится вне кавычек - PullRequest
1 голос
/ 30 мая 2019

Моя строка имеет следующий формат:

string = 'token1 -token2 +"token 3"'

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

result = [
    'token1',
    '-token2',
    '+token 3'
]

Я использую для этого модуль csv, нонеудачно получить последний токен как '+"token', '3"'

# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv

f = StringIO('token1 -token2 +"token 3"')

tokens = csv.reader(f, delimiter=' ', doublequote=False, quotechar='"', quoting=csv.QUOTE_NONE)

for t in tokens: print(t)
# > ['token1', '-token2', '+"token', '3"']

Ответы [ 2 ]

1 голос
/ 30 мая 2019

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

# for Python 2.x
try: from StringIO import StringIO
# for Python 3.x
except ImportError: from io import StringIO
import csv

f = StringIO('token1 -token2 +"token 3"')

def check_and_split(line):
    tokens = []
    is_quote = False
    token = ''
    for c in line:
        if c == ' ' and (not is_quote):
            is_quote = False
            tokens.append(token)
            token = ''
        elif c == '"':
            is_quote = True
        else:
            token += c
    tokens.append(token)
    return tokens


for line in f:
    tokens = check_and_split(line)
    for t in tokens: 
        print(t)

Выход:

token1
-token2
+token 3
0 голосов
/ 31 мая 2019

csv не распознает +"token 3" как одно значение, потому что кавычки не охватывают все это.Поэтому убедитесь, что они делают:

line = line.replace('+"', '"+')

и измените csv.QUOTE_NONE на csv.QUOTE_MINIMAL (или просто сбросьте quoting arg).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...