我正在搜索可以以两种不同模式显示的数字。这些模式在单个字符串中是互斥的,因为它们具有相同的含义,我想将结果合并到一个变量中。
abc: DIGIT
或DIGIT-xyz
创建模式本身不是问题,但是我不确定如何正确返回匹配的组(数字)。
text = 'lorem ipsum abc: 3 lorem ipsum'
my_pattern = re.compile("(abc:\s+(\d)|(\d)-xyz)")
result = re.search(my_pattern, text)
if result:
if result.group(2):
return result.group(2)
else:
return result.group(3)
# returns 3
此解决方案效果很好,但是如果有两个以上的替代方案怎么办?有没有一种更优雅的方法来代替编写多个条件语句?
答案 0 :(得分:0)
由于您知道只有一个组将被“填充”,因此您可以从None
中过滤掉所有result.groups()
值并获得第一项。仅在需要提取的部分周围使用捕获组,而不在整个模式周围使用
import re
text = 'lorem ipsum abc: 3 lorem ipsum'
my_pattern = re.compile(r"abc:\s+(\d)|(\d)-xyz")
result = my_pattern.search(text)
if result:
print(list(filter(None, result.groups()))[0])
请参见Python demo。