在一个python正则表达式搜索中匹配两个互斥的组

时间:2019-03-25 09:53:07

标签: python regex

我正在搜索可以以两种不同模式显示的数字。这些模式在单个字符串中是互斥的,因为它们具有相同的含义,我想将结果合并到一个变量中。

abc: DIGITDIGIT-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

此解决方案效果很好,但是如果有两个以上的替代方案怎么办?有没有一种更优雅的方法来代替编写多个条件语句?

1 个答案:

答案 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