我试图编写一个可以解析"<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+)
然而,这仅匹配字符串的第一个字母。
答案 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