圆括号内的非贪婪正则表达式并包含文本。

3
假设我有一个看起来像这样的字符串:
test = 'this is a (meh) sentence that uses (random bits of meh2) and (this is silly)'

我希望提取括号内仅包含单词“meh”的文本。

使用非贪婪正则表达式匹配括号内的任何内容:

re.findall(r'\((.*?)\)', test)

返回

['meh', 'random bits of meh2', 'this is silly']

尝试只包括第一个和第二个内容:

re.findall(r'\((.*meh.*?)\)', test)

返回

['meh) sentence that uses (random bits of meh2']

I want a regex to return only

['meh', 'random bits of meh2']

请问有人能帮忙吗?谢谢!


1
使第一个 .* 非贪婪。 - internet_user
1
^yup: \((.*?meh.*?)\) - zzxyz
啊,错过了那个。谢谢! - Alison LT
2个回答

4

与其允许所有字符,您可以使用 [^\)] 替换 . 来允许除右括号外的所有字符。

re.findall(r'\(([^\)]*meh[^\)]*?)\)', test)

有趣的是,在regex101.com上比较这两个选项,这个版本使用了131步,大约4毫秒,而非贪婪版本使用了146步,大约1毫秒。 - Worthwelle

0
re.findall(r'\((.*?meh.*?)\)', test)

2
r'\((.*?meh.*?)\)' won't work. It should be re.findall(r'\(([^()]*meh[^()]*)\)', test) - Wiktor Stribiżew
2
@zzxyz 在 this is a (meh) sentence that uses (random bits of meh2) and (this is silly) 这个句子中,\((.*?meh.*?)\) 只是一个巧合。你可以在这里看到它会因为 (this) is a (meeeeeh) sentence that uses (random bits of meh2) and (this is silly) 而失效:https://regex101.com/r/0CoSVK/1。 - Wiktor Stribiżew
@WiktorStribiżew - 啊,是的...虽然有点懒,但正则表达式会尽快开始匹配。谢谢! - zzxyz
@WiktorStribiżew,感谢您的澄清和示例!我已将您的解决方案标记为已接受。 - Alison LT
这是Worthwelle的答案,不是我的 :-) - Wiktor Stribiżew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接