匹配带引号或不带引号字符串的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)
有没有办法可以一步到位完成这个操作呢?
2 个回答
1
看起来你并不需要用到 re.match
。你的正则表达式差不多是对的,但你分组的方式有点多。这样做怎么样呢?
>>> s
('xyz term:abc 123 foo', 'foo term:"abc 123 "foo')
>>> re.findall(r'term:([^ "]+|"[^"]+")', '\n'.join(s))
['abc', '"abc 123 "']
4
避免使用分组,改为使用前瞻和后顾断言,这样可以去掉不需要的部分:
s = 'term:foo term:"foo bar" term:bar foo term:"foo term:'
re.findall(r'(?<=term:)[^" ]+|(?<=term:")[^"]+(?=")', s)
结果是:
['foo', 'foo bar', 'bar']