Python在括号内搜索并返回文本

时间:2014-06-06 10:05:51

标签: python regex parentheses

好的,我已经阅读了许多类似的问题并尝试了它们,但由于某种原因它不起作用。我有一个包含大量行的文件,如下所示:

以下是一些词语:

"<Hello> (silly girl) that isn't what she want(s)"

我正在尝试在括号内搜索两个或更多字符的文本。 re.searchgroup()的许多组合都会返回一些内容,但不完全是我正在寻找的内容。在这种情况下,我想要返回并打印的值是:"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)

我做错了什么?

1 个答案:

答案 0 :(得分:3)

默认情况下,正则表达式 greedy ,因此从第一个'(''silly'之前)到最后一个('want(s'之后)进行捕获。代替:

  • '?';
  • 匹配 lazy
  • 使用'[^()]'而不是'.'从匹配项中排除括号(感谢@ 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的演示。