Python正则表达式匹配带引号或不带引号的字符串

时间:2011-10-22 15:43:24

标签: python regex

我正在尝试在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)

有没有办法一步完成这一切?

2 个答案:

答案 0 :(得分:4)

避免分组,而是使用lookahead / lookbehind断言来消除不需要的部分:

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

给出:

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

答案 1 :(得分:1)

这似乎不是你真的想要re.match。你的正则表达式几乎是正确的,但是你的分组太多了。怎么样?

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