正则表达式匹配最后一次出现

3

除了这两种方法,我正在寻找其他的解决方式:

# match last occurence of \d+, 24242 in this case
>>> test = "123_4242_24242lj.:"
>>> obj = re.search(r"\d+(?!.*\d)", test)
>>> obj.group()
'24242'
>>> re.findall(r"\d+", test)[-1]
'24242'
3个回答

2
我相信你可以找到更聪明的正则表达式来完成这个任务,但我认为你应该坚持使用findall()
正则表达式很难阅读。不仅别人难以理解:如果你离上一次编写它已经过去了10天,那么你自己也会觉得它很难读。这使得维护它们变得困难。
除非性能至关重要,否则最好尽量减少正则表达式的工作量。这行代码...
re.findall(r"\d+", test)[-1]

...干净、简洁且立即明显。


3
即使性能不是很关键,如果正则表达式被使用超过一次,我建议使用re.compile来编译它。 - thefourtheye

1
这个基于前瞻的正则表达式匹配字符串中的最后数字:
\d+(?=\D*$)

1
我正在尝试寻找除了这两种方法以外的其他方法: 对您第一种方法进行轻微修改。捕获字符串末尾后跟着任何非数字字符的数字。
>>> import re
>>> test = "123_4242_24242lj.:"
>>> print re.findall(r'(\d+)\D*$', test)
['24242']
>>>

另一种选择是进行替换:

。其中包含替代:

>>> re.sub(r'.*?(\d+)\D*$', "\\1", test)
'24242'

1
@thefourtheye 很好的观点!你确实是个天才。不过,改变修饰符应该可以解决这个问题。 - devnull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接