#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. Это также соответствует заключающим кавычкам, которые мне не нужны.