好的,我已经阅读了许多类似的问题并尝试了它们,但由于某种原因它不起作用。我有一个包含大量行的文件,如下所示:
以下是一些词语:
"<Hello> (silly girl) that isn't what she want(s)"
我正在尝试在括号内搜索两个或更多字符的文本。 re.search
和group()
的许多组合都会返回一些内容,但不完全是我正在寻找的内容。在这种情况下,我想要返回并打印的值是:"silly girl"
。
现在我有这个:
regex = re.compile("\((.+.+)\)")
for line in lines:
m = re.search(regex, line)
if m:
print(m.group())
以上版画:
(silly girl) that isn't what she want(s)
如果我将组索引更改为1
,就像print(m.group(1))
一样,它会在没有第一个括号的情况下打印相同的内容:
silly girl) that isn't what she want(s)
我做错了什么?
答案 0 :(得分:3)
默认情况下,正则表达式 greedy ,因此从第一个'('
('silly'
之前)到最后一个('want(s'
之后)进行捕获。代替:
'?'
; '[^()]'
而不是'.'
从匹配项中排除括号(感谢@ thg435,并查看他们对该问题的评论以了解潜在的缺点); '{2,}'
表示&#34;两个或更多&#34;而不是两个单独的&#34;一个或多个&#34; '+'
S;和现在你有:
regex = re.compile(r"\(([^()]{2,}?)\)")
这可让您切换到findall
以获取结果列表:
>>> import re
>>> regex = re.compile(r"\(([^()]{2,}?)\)")
>>> s = "<Hello> (silly girl) that isn't what she want(s)"
>>> m = re.findall(regex, s)
>>> m
['silly girl']
查看正则表达式here的演示。