如何在re.search()中使用两种模式?

时间:2019-04-13 22:33:22

标签: python regex

我有以下字符串string = DdCcaaBbbB。我要删除具有以下形式的同一字母的所有组合,即x是任何字母:xXXx

我想一个一个地删除它们,在示例中,首先删除Dd,然后删除CcBb,最后删除bB

到目前为止,我所做的是:

for letter in string.lower():
    try:
        string = string.replace(re.search(letter + letter.upper(), string).group(),'')
    except:
        try: 
            string = string.replace(re.search(letter.upper() + letter, string).group(),'')
        except:
            pass

但是我确信这不是最Python的方式。我想到的是一个问题,那就是我是否可以结合正在寻找的两种模式。任何其他建议或改进都值得欢迎!

1 个答案:

答案 0 :(得分:0)

我认为您可以进行不区分大小写的正则表达式搜索,以找到相同两个字母的所有组合,然后在确定是否为xXXx格式时进行功能检查应该将其替换(什么都不要)或单独放置。

def replacer(match):
    text = match.group()
    if (text[0].islower() and text[1].isupper()) or (text[0].isupper() and text[1].islower()):
        return ""
    return text

string = "DdCcaaBbbB"
pattern = r'([a-z])\1'
new_string = re.sub(pattern, replacer, string, flags=re.IGNORECASE)

这种方法有一个缺点。由于正则表达式不区分大小写匹配,因此您无法测试重叠的匹配项。因此,如果您有一个类似'BBbb'的输入字符串,它将匹配两个大写字母B和两个小写字母b,并且不会替换任何一对,并且不会检查Bb对在中间。

不幸的是,我认为正则表达式无法解决该问题,因为它无法在搜索过程中转换大小写。我们已经超出了最基本的正则表达式规范的范围,因为我们需要使用反向引用来达到我们所能做到的范围。