Skip to main content
 首页 » 编程设计

python 正则表达式问题,操作

2025年05月04日22jillzhang

在下面的示例中,我试图制作一个正则表达式来查找一行中的最后一组 1 个或多个连续数字。

据我所知,在 python3 中,re.search() 尝试从左到右匹配搜索字符串。

这是否解释了以下示例中的行为?具体来说,这就是为什么 '.*?' 的原因吗?在捕获 block 之前需要(当锚定在前面时,如前两个示例中所示)以便捕获 block 捕获两个数字,而 '?'当正则表达式锚定到行尾时是可选的(如最后两个示例?)

Python 3.1.2 (release31-maint, Sep 17 2010, 20:27:33)  
>>> import re 
>>> a = "hi there in the morning {23)" 
>>> R = re.compile('^.*(\d+)', re.IGNORECASE); print(R.search(a).group(1)) 
3  
>>> R = re.compile('^.*?(\d+)', re.IGNORECASE); print(R.search(a).group(1)) 
23 
>>> R = re.compile('(\d+).*$', re.IGNORECASE); print(R.search(a).group(1)) 
23 
>>> R = re.compile('(\d+).*?$', re.IGNORECASE); print(R.search(a).group(1)) 
23 

请您参考如下方法:

  • ^.*(\d+) - 从头开始​​匹配。 .* 会一直匹配到行尾,然后 \d+ 会让 .* 回溯(取消之前的匹配),根据需要尽可能少,因此 \d+ 将只匹配最后一位。
  • ^.*?(\d+) - 从头开始​​匹配。 .*? 一开始什么都不匹配。 \d+ 稍后会失败(如果第一个字符不是数字),使 .*? 回溯,并匹配额外的字符,直到找到 第一个 数字,然后 + 将匹配其后的所有数字。对于 abc123edf567,模式将匹配 123,第一组数字。
  • (\d+).*$ - \d+ 将匹配第一组数字。 .*$ 将始终成功并一直匹配到最后。
  • (\d+).*?$ - 这个实际上是一样的(虽然可以说稍微慢一点)。 \d+ 将匹配第一组数字。 .*?$ 一开始不会匹配任何字符,但随后会匹配越来越多的字符,直到匹配到 $。请记住 *? 在左边是惰性的,但这并不意味着引擎会根据需要从右边获取尽可能少的字符。

您可能正在寻找的是 (\d+)\D*$ - 匹配一组字符,后跟非字符和行尾。这将返回最后一组数字。

另请参阅:regular-expressions.info - Laziness Instead of Greediness