`re`模块匹配Python3中两对括号之间的文本

时间:2015-09-16 09:26:51

标签: python regex python-3.x

例如,我有一个像'(10 + 20) / (10 + 20)'这样的字符串。

现在我要匹配(10 + 20)。所以我写了一个这样的脚本:

text = '(10 + 20) / (10 + 20)'                                                                                                          
test1 = re.findall(r'(.*)', text)                                            
test2 = re.findall(r'(.+?)', text)                                           

for i in test1:                                                              
    print(i, end='')                                                         
else:                                                                        
    print()                                                                  

for i in test2:                                                              
    print(i, end='')                                                         
else:                                                                        
    print()       

输出是这样的:

(10 + 20) / (10 + 20)                                                                                                                       
(10 + 20) / (10 + 20)

我不明白,.+?不贪婪吗?

3 个答案:

答案 0 :(得分:3)

正则表达式模式中的圆括号必须使用\进行转义,以匹配文字圆括号:

test2 = re.findall(r'\(.+?\)', text) 

请参阅demo

“原始”字符串文字并不意味着您不必转义特殊的正则表达式字符,但这意味着您只能使用一个反斜杠来转义它们,而不是两个。

请参阅6.2.5.8. Raw String Notation的摘录:

  

原始字符串表示法(r"text")使正则表达式保持正常。没有它,正则表达式中的每个反斜杠('\')都必须以另一个为前缀来对其进行转义。例如,以下两行代码在功能上是相同的:

     

>>>
     >>> re.match(r"\W(.)\1\W", " ff ")
     <_sre.SRE_Match object; span=(0, 4), match=' ff '>
     >>> re.match("\\W(.)\\1\\W", " ff ")
     <_sre.SRE_Match object; span=(0, 4), match=' ff '>

文档说通常是,但这并不意味着每次都必须使用原始字符串文字。

.+?确实是一种懒惰模式,它意味着匹配换行符以外的1个或多个字符,但尽可能少

答案 1 :(得分:1)

你需要像这样逃避()

`\(.*\)`

和这个

`\(.+?\)`. 

第一个匹配,直到找到最后一个),另一个非贪婪,将停在第一个)

答案 2 :(得分:1)

>>> import re
>>> re.findall(r'\([^()]+\)', '(10 + 20) / (10 + 20)')
['(10 + 20)', '(10 + 20)']

re模块中使用的正则表达式的方言不能支持任意嵌套括号,因此匹配括号以外的所有内容[^()]始终有效。

注意:您不需要在()内转义定义一组字符的[]