我试图匹配字符串中的最后一个数字,例如
中的“34”3.1一般定义34
我正在使用Python风格的正则表达式,我尝试过:
(.*?)(\d)
以便稍后我可以使用\ 1来引用“3.1 General definitions”和\ 2来引用“34”。
但是\ 2匹配“4”而不是“34”。那我该怎么办?
谢谢和问候!
答案 0 :(得分:12)
您目前只匹配一位数字。尝试
(.*?)(\d+)
匹配至少一位数。这应该是你所需要的,因为你已经让比赛的第一部分不情愿(非贪婪)。
根据您执行匹配的方式,可能最后需要一个“字符串结尾”锚点($),以确保它与开头的数字不匹配字符串。
答案 1 :(得分: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')
我认为是正确的: new:如果字符串不以结尾,我会这样做:
>>> re.match(r'(.*)(?<=\D)(\d+)', '3.1 General definitions 34 more text').groups()
('3.1 General definitions ', '34')
.*
需要贪婪地获取你想要的字符串的开头,但是我们不能让它悄悄地抬起34
的第一个数字,所以我们提供(?<=\D)
,一个看守的断言,阻止它发生
答案 2 :(得分:3)
你可以尝试:
(.+?)(\d+$)
因为它会给你:
>>> r.groups()
(u'3.1 General definitions ', u'34')
你需要在开始时让它变得贪婪。