我正在尝试匹配以下字符串
foo=boo-40
foo=1*boo+0
foos=1/10*boo+0
foos=1*boo-32000
foos=boo*1
foos=boo*1/10
usingregex。
为此,我正在使用以下正则表达式:
'[(foo|foos)]=(?P<Pnum1>\d+)?(/?P<Pdenom1>\d+)?\*?\(?boo\)?\*?(?P<Pnum2>\d+)?(/?P<Pdenom2>\d+)?(?P<Poffset>[+-]\d+)?'
我的问题是假设没有找到Pnum1,而是找到了Pnum2。
如何检测找到哪个Pnum1或Pnum2?
我尝试了以下内容:
try:
if match.group('Pnum1'):
Pnum = match.group('Pnum1')
elif match.group('Pnum2'):
Pnum = match.group('Pnum2')
else:
Pnum = None
except IndexError:
Pnum = None
但是这个测试是错误的,因为如果'Pnum1'不存在,代码不会测试'Pnum2'(它可能不存在)。
是否可以检索找到的匹配元素?或者从match.group('Pnum2')
返回默认值(比如字典中的get)?
答案 0 :(得分:1)
假设正则表达式是正确的,那么如果您只是执行以下操作,而不是测试,则会更好:
Pnum = match.group('Pnum1') or match.group('Pnum2')
当or
返回第一个 truthy 值或最后一个 falsy 时,如果'Pnum1'
不是None
,则变量将从'Pnum1'
获取值。如果是None
,则来自'Pnum2'
的值。如果两者都是None
,则会变为None
。
请注意,这会优先考虑您在or
表达式中首先放置的术语。