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

2 投票
2 回答
2330 浏览
提问于 2025-04-17 04:49

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

撰写回答