使用Python提取具有特定格式的括号

使用Python提取具有特定格式的括号,python,regex,Python,Regex,我对python相当陌生,所以如果这是一个新手问题,我很抱歉,但我正在尝试从原始文本文件中具有特定格式的括号中提取文本。 我用正则表达式尝试过这个方法,但请告诉我它们是否是更好的方法 要通过示例说明我想做什么,请执行以下操作: s = "Testing (Stackoverflow, 2013). Testing (again) (Stackoverflow, 1999)" 从这个字符串中,我希望得到如下结果: ['(Stackoverflow, 2013)', '(Stackoverflow

我对python相当陌生,所以如果这是一个新手问题,我很抱歉,但我正在尝试从原始文本文件中具有特定格式的括号中提取文本。 我用正则表达式尝试过这个方法,但请告诉我它们是否是更好的方法

要通过示例说明我想做什么,请执行以下操作:

s = "Testing (Stackoverflow, 2013). Testing (again) (Stackoverflow, 1999)"
从这个字符串中,我希望得到如下结果:

['(Stackoverflow, 2013)', '(Stackoverflow, 1999)']
到目前为止,我尝试的正则表达式是

"(\(.+[,] [0-9]{4}\))"
但是,与re.findall()结合使用,这只会给出以下结果:

['(Stackoverflow, 2013). Testing (again) (Stackoverflow, 1999)']
所以,正如您可能已经猜到的,我试图从一个.txt文件中提取参考书目。但我不想提取任何恰好在括号中的东西,这些东西不是参考书目

如果这是新手,我再次道歉,如果已经有这样的问题了,我再次道歉。我已经找过了,但还没有找到

使用
[^()]
而不是
。这将确保没有嵌套的()

使用
[^()]
而不是
。这将确保没有嵌套的()


假设您没有嵌套的括号,您可以这样使用:
(\([^()]+?,[0-9]{4}\)
。这将匹配一组括号内的任何非括号字符,括号后跟一个逗号、一个空白四位数字和一个右括号。

假设没有嵌套的括号,可以这样使用:
(\([^()]+?,[0-9]{4}\)
。这将匹配一组括号内的任何非括号字符,括号后跟一个逗号、一个空白四位数和一个右括号。

我建议使用类似于
\(\w+,\s+[0-9]{4}\)
。与原始版本相比,有几处更改:

  • 匹配单词字符(字母/数字/下划线),而不是源名称中的任何字符
  • 在逗号后匹配一个或多个空格字符,而不是将自己限制为单个文本空格

我建议像
\(\w+,\s+[0-9]{4}\)
。与原始版本相比,有几处更改:

  • 匹配单词字符(字母/数字/下划线),而不是源名称中的任何字符
  • 在逗号后匹配一个或多个空格字符,而不是将自己限制为单个文本空格

谢谢!这非常好,在我的全文文件中也是如此。你介意解释一下这个“[^()]+”是如何工作的吗?谢谢!这非常好,在我的全文文件中也是如此。你介意解释一下这个“[^()]+”是如何工作的吗?啊,太好了。谢谢你的解释!是的,不会有嵌套的括号。然而,这将如何改变你的反应?@SamPassmore:很高兴你的回答是正确的。它会因此而改变:
[^()]
。这要求引擎不匹配任何已经包含在另一组括号中的括号,因此需要进行更改以适应嵌套。啊,太好了。谢谢你的解释!是的,不会有嵌套的括号。然而,这将如何改变你的反应?@SamPassmore:很高兴你的回答是正确的。它会因此而改变:
[^()]
。这会要求引擎不匹配已包含在另一组括号中的任何括号,因此需要进行更改以适应嵌套。
>>> re.findall("(\([^()]+[,] [0-9]{4}\))", s)
['(Stackoverflow, 2013)', '(Stackoverflow, 1999)']