首页 > 解决方案 > 为因大小写而异的相邻字母而努力使用正则表达式

问题描述

我希望能够递归地删除字符串中仅在它们的情况下不同的相邻字母,例如如果 s = AaBbccDd 我希望能够删除 Aa Bb Dd 但保留 cc。

我可以使用列表递归地执行此操作:

我认为可以使用正则表达式来完成,但我正在努力:

使用测试字符串“fffAaaABbe”,答案应该是“fffe”,但我使用的正则表达式给出了“fe”

def test(line):
    res = re.compile(r'(.)\1{1}', re.IGNORECASE)
    #print(res.search(line))
    while res.search(line):
        line = res.sub('', line, 1)
    print(line)

工作方式是:

def test(line):
    result =''
    chr = list(line)
    cnt = 0
    i = len(chr) - 1

    while i > 0:
        if ord(chr[i]) == ord(chr[i - 1]) + 32 or ord(chr[i]) == ord(chr[i - 1]) - 32:
            cnt += 1
            chr.pop(i)
            chr.pop(i - 1)
            i -= 2
        else:
            i -= 1
    if cnt > 0: # until we can't find any duplicates.
        return test(''.join(chr))
    result = ''.join(chr)
    print(result) 

是否可以使用正则表达式来做到这一点?

标签: pythonregex

解决方案


re.IGNORECASE不是解决这个问题的方法,因为它会以同样的方式处理aa, Aa, aA, AA。从技术上讲,可以使用re.sub, 以下方式。

import re
txt = 'fffAaaABbe'
after_sub = re.sub(r'Aa|aA|Bb|bB|Cc|cC|Dd|dD|Ee|eE|Ff|fF|Gg|gG|Hh|hH|Ii|iI|Jj|jJ|Kk|kK|Ll|lL|Mm|mM|Nn|nN|Oo|oO|Pp|pP|Qq|qQ|Rr|rR|Ss|sS|Tt|tT|Uu|uU|Vv|vV|Ww|wW|Xx|xX|Yy|yY|Zz|zZ', '', txt)
print(after_sub)  # fffe

请注意,我明确定义了所有可能的字母对,因为到目前为止我知道没有办法只使用re模式来说“反转大小写字母”。也许其他用户将能够提供更简洁re的解决方案。


推荐阅读