在下面的示例中,我试图制作一个正则表达式来查找一行中的最后一组 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
