Регулярное выражение Python для сопоставления строки в кавычках или без кавычек

#python #regex

#python #регулярное выражение

Вопрос:

Я пытаюсь написать регулярное выражение на Python, которое будет соответствовать либо строке в кавычках с пробелами, либо строке без кавычек без пробелов. Например, если задана строка term:foo , результат будет foo , и если задана строка term:"foo bar" , результат будет foo bar . До сих пор я придумал следующее регулярное выражение:

 r = re.compile(r'''term:([^ "] )|term:"([^"] )"''')
 

Проблема в том, что совпадение может прийти в любом group(1) или group(2) поэтому я должен сделать что-то вроде этого:

 m = r.match(search_string)
term = m.group(1) or m.group(2)
 

Есть ли способ, которым я могу сделать все это за один шаг?

Комментарии:

1. Вы знаете о shlex.split() ?

2. Может ли строка, заключенная в кавычки, содержать экранированную кавычку?

3. Меня не беспокоят экранированные кавычки.

4. Нет, я не слышал shlex , но в документации говорится, что он не поддерживает Unicode, поэтому он не будет работать для меня.

Ответ №1:

Избегайте группировки и вместо этого используйте утверждения lookahead / lookbehind, чтобы исключить ненужные части:

 s = 'term:foo term:"foo bar" term:bar foo term:"foo term:'
re.findall(r'(?<=term:)[^" ] |(?<=term:")[^"] (?=")', s)
 

Дает:

 ['foo', 'foo bar', 'bar']
 

Ответ №2:

Не похоже, что вы действительно этого хотите re.match . Ваше регулярное выражение почти правильное, но вы слишком много группируете. Как насчет этого?

 >>> s
('xyz term:abc 123 foo', 'foo term:"abc 123 "foo')
>>> re.findall(r'term:([^ "] |"[^"] ")', 'n'.join(s))
['abc', '"abc 123 "']
 

Комментарии:

1. Это также соответствует заключающим кавычкам, которые мне не нужны.