带*的Python正则表达式?

2024-04-19 14:30:28 发布

您现在位置:Python中文网/ 问答频道 /正文

这个Python正则表达式匹配什么?在

.*?[^\\]\n

我很困惑为什么.后面都是*和{}。在


3条回答

*表示“尽可能多次匹配上一个元素(零次或多次)”。在

*?表示“尽可能少地匹配上一个元素(零次或多次)”。在

其他答案已经解决了这个问题,但是他们没有提到它是如何改变regex的,如果提供了re.DOTALL标志,它会有很大的不同,因为.将匹配启用的换行符。因此.*[^\\]\n将从字符串的开头一直匹配到前面没有反斜杠的最后一个换行符(因此多行将匹配)。在

如果没有提供re.DOTALL标志,区别就更细微,[^\\]将匹配除反斜杠以外的所有内容,包括换行符。考虑以下示例:

>>> import re
>>> s = "foo\n\nbar"
>>> re.findall(r'.*?[^\\]\n', s)
['foo\n']
>>> re.findall(r'.*[^\\]\n', s)
['foo\n\n']

因此,此regex的目的是查找不以反斜杠结尾的非空行,但是如果使用.*而不是{},那么如果在非空行后面有一个空行,那么将匹配一个额外的\n。在

这是因为.*?只匹配fo[^\\]将匹配第二个o,而{}匹配在第一行的末尾。但是.*将匹配foo[^\\]将匹配\n以结束第一行,而下一个{}将匹配,因为第二行是空的。在

.表示通配符。它可以匹配除\n之外的任何内容,除非使用了适当的标志。在

*表示前面可以有0个或更多个对象。在

?表示前面的量词是惰性的。它将在找到第一个匹配项后停止搜索。在

打开Python re module documentation,搜索*?,我们发现:

*?, +?, ??:

The *, +, and ? qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; if the RE <.*> is matched against <H1>title</H1>, it will match the entire string, and not just <H1>. Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using .*? in the previous expression will match only <H1>.

相关问题 更多 >