Python正则表达式在字符串末尾提取可选数字

时间:2014-07-24 08:46:18

标签: python regex string

我试图编写一个可以解析"<name>(<number>)"类型字符串的Python正则表达式,其中<number>是可选的。

例如,如果我通过'sclkout',那么最后没有数字,因此它应该匹配'sclkout'。如果输入为'line7',则应匹配'line''7'。该名称也可以包含其中的数字,因此如果我将其设为'dx3f',则输出应为'dx3f',但对于'dx3b0',它应匹配'dx3b'和{{1} }}

这是我第一次尝试的:

0

这当然是错误的,因为import re def do_match(signal): match = re.match('(\w+)(\d+)?', signal) assert match print "Input = " + signal print "group1 = " + match.group(1) if match.lastindex == 2: print "group2 = " + match.group(2) print "" # should match 'sclkout' do_match("sclkout") # should match 'line' and '7' do_match("line7") # should match 'dx4f' do_match("dx4f") # should match 'dx3b' and '0' do_match("dx3b0") 组中的贪婪匹配,所以我尝试将其设置为非贪婪:

(\w+)

然而,这仅匹配字符串的第一个字母。

3 个答案:

答案 0 :(得分:2)

你不需要正则表达式:

from itertools import takewhile
def do_match(s):
    num = ''.join(takewhile(str.isdigit, reversed(s)))[::-1]
    return s[:s.rindex(num)], num
... 
>>> do_match('sclkout')
('sclkout', '')
>>> do_match('line7')
('line', '7')
>>> do_match('dx4f')
('dx4f', '')
>>> do_match('dx3b0')
('dx3b', '0')

答案 1 :(得分:1)

您可以使用这样的占有量词:

^(?<name>\w+?)(?<number>\d+)?$

^(\w+?)(\d+)?$,如果您不想要指定的捕获组。

点击此处观看现场演示:http://rubular.com/r/44Ntc4mLDY

答案 2 :(得分:1)

([a-zA-Z0-9]*[a-zA-Z]+)([0-9]*)就是你想要的。

import re
test = ["sclkout", "line7", "dx4f", "dx3b0"]
ans  = [("sclkout", ""), ("line", "7"), ("dx4f", ""), ("dx3b", "0")]

for t, a in zip(test, ans):
    m = re.match(r'([a-zA-Z0-9]*[a-zA-Z]+)([0-9]*)', t)
    if m.groups() == a:
        print "OK"
    else:
        print "NG"

输出:

OK
OK
OK
OK