我正在尝试在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)
有没有办法一步完成这一切?
答案 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 "']