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个或更多重复
  • 到1点。和2,整个字符串(
    foo.bar
    )与
    *
    匹配
  • [.]
    尝试查找字符
    ,但没有剩余字符
  • *$
    什么都不做
  • 没有找到匹配项

  • 我想知道这段代码实际上是如何工作的。

    表达式
    *
    使正则表达式引擎尽可能地匹配,而不是所有内容

    通常,正则表达式引擎会像您所描述的那样通过行的末尾进行匹配,但随后会返回到较早的位置,直到可以继续进行剩余的匹配


    也许可以把它想象成一个迷宫解算器,系统地探索迷宫的每一个可能的连接点,直到找到出口,或者耗尽搜索空间。

    按照这种逻辑,你永远无法在正则表达式中使用
    *
    ,因为它总是匹配所有东西,这显然不是
    *
    匹配
    foo
    的情况,因为它会回溯,使
    [.]
    匹配
    。字符串的其余部分由
    *$
    匹配。您必须记住,正则表达式引擎希望匹配某些内容,因此它们会一直尝试,直到所有可能的测试都已完成。请使用regex101.com为您解释:不知道贪婪
    *
    根据需要返回字符。