Python 为什么'*[.].*$';是否与filename.extension匹配?
在研究正则表达式时,我发现了以下示例:Python 为什么'*[.].*$';是否与filename.extension匹配?,python,regex,Python,Regex,在研究正则表达式时,我发现了以下示例: >>> import re >>> p = re.compile('.*[.].*$') >>> m = p.search('foo.bar') >>> print(m.group()) foo.bar 我不理解它识别扩展名为foo.bar,abc.xyz,my_files.txt的简单文件名的过程。我认为这段代码的工作原理如下: 与任何字符匹配 *导致匹配0个或更多重复 到1点。和
>>> import re
>>> p = re.compile('.*[.].*$')
>>> m = p.search('foo.bar')
>>> print(m.group())
foo.bar
我不理解它识别扩展名为foo.bar
,abc.xyz
,my_files.txt
的简单文件名的过程。我认为这段代码的工作原理如下:
与任何字符匹配*
导致匹配0个或更多重复foo.bar
)与*
匹配[.]
尝试查找字符
,但没有剩余字符*$
什么都不做我想知道这段代码实际上是如何工作的。表达式
*
使正则表达式引擎尽可能地匹配,而不是所有内容
通常,正则表达式引擎会像您所描述的那样通过行的末尾进行匹配,但随后会返回到较早的位置,直到可以继续进行剩余的匹配
也许可以把它想象成一个迷宫解算器,系统地探索迷宫的每一个可能的连接点,直到找到出口,或者耗尽搜索空间。按照这种逻辑,你永远无法在正则表达式中使用
*
,因为它总是匹配所有东西,这显然不是*
匹配foo
的情况,因为它会回溯,使[.]
匹配
。字符串的其余部分由*$
匹配。您必须记住,正则表达式引擎希望匹配某些内容,因此它们会一直尝试,直到所有可能的测试都已完成。请使用regex101.com为您解释:不知道贪婪*
根据需要返回字符。