例如,我有一个像'(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)
我不明白,.+?
不贪婪吗?
答案 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
模块中使用的正则表达式的方言不能支持任意嵌套括号,因此匹配括号以外的所有内容[^()]
始终有效。
注意:您不需要在()
内转义定义一组字符的[]
。