匹配字符串中的最后一个数字

3 投票
3 回答
3241 浏览
提问于 2025-04-16 18:19

我想在一个字符串中找到最后的数字,比如在

3.1 General definitions 34

这个例子中找到“34”。

我使用的是类似Python的正则表达式,试过了:

(.*?)(\d)

这样我就可以用 \1 来指代“3.1 General definitions”,用 \2 来指代“34”。

但是 \2 匹配到的是“4”,而不是“34”。那我该怎么做呢?

谢谢!

3 个回答

3

你可以试试:

(.+?)(\d+$)

这样做会给你:

>>> r.groups()
(u'3.1 General definitions ', u'34')

你需要在一开始就让它变得贪心一些。

4

你最开始的方法:

>>> re.match(r'(.*?)(\d)', '3.1 General definitions 34').groups()
('', '3')

Jon Skeet的回答(编辑:我忘了提到Jon建议在字符串末尾进行匹配,现在示例已更正):

>>> re.match(r'(.*?)(\d+$)', '3.1 General definitions 34').groups()
('3.1 General definitions ', '34')

我认为正确的做法: 新的:如果这个字符串不是以数字结尾,我会这样做:

>>> re.match(r'(.*)(?<=\D)(\d+)', '3.1 General definitions 34 more text').groups()
('3.1 General definitions ', '34')

.* 需要贪婪地匹配,以获取你想要的字符串开头,但我们不能让它把 34 的第一个数字也匹配上,所以我们提供了 (?<=\D),这是一个向后查看的断言,用来防止这种情况发生。

12

你现在只是在匹配一个数字。试试

(.*?)(\d+)

去匹配至少一个数字。这应该就够了,因为你已经把匹配的第一部分设置为不贪婪模式了。

根据你是怎么进行匹配的,你可能需要在最后加一个“字符串结束”的标记($),这样可以确保它不会匹配到字符串开头的数字。

撰写回答