首页 文章

在python中用空字符串替换捕获的组

提问于
浏览 555
4

我目前有一个类似于以下的字符串:

str = 'abcHello Wor=A9ld'

我想要做的是找到'abc'和'= A9'并用空字符串替换这些匹配的组,这样我的最终字符串就是'Hello World' .

我目前正在使用这个正则表达式,它正确地找到我要替换的组:

r'^(abc).*?(=[A-Z0-9]+)'

我尝试使用以下代码替换这些组:

clean_str = re.sub(r'^(abc).*?(=[A-Z0-9]+)', '', str)

使用上面的代码导致:

print(clean_str)
>>> 'ld'

我的问题是,如何使用re.sub用空字符串替换这些组并获取我的“Hello World”?

4 回答

  • 3

    捕获其他所有内容并将这些组放入替换中,如下所示:

    re.sub(r'^abc(.*?)=[A-Z0-9]+(.*)', r'\1\2', s)
    
  • 2

    有没有办法可以......确保abc存在,否则不要替换第二种模式?

    我知道您需要首先检查字符串是否以 abc 开头,如果是,则删除字符串中的 abc=[0-9A-Z]+ pattern的所有实例 .

    我建议:

    import re
    s="abcHello wo=A9rld"
    if s.startswith('abc'):
        print(re.sub(r'=[A-Z0-9]+', '', s[3:]))
    

    这里, if s.startswith('abc'): 检查字符串是否在开头有 abc ,然后 s[3:] 从开始删除 abc 截断字符串,然后 re.sub 删除 =[A-Z0-9]+ 模式的所有非重叠实例 .

    请注意,您可以使用PyPi regex module对一个正则表达式执行相同操作:

    import regex
    r = regex.compile(r'^abc|(?<=^abc.*?)=[A-Z0-9]+', regex.S)
    print(r.sub('', 'abcHello Wor=A9ld=B56')) # Hello World
    print(r.sub('', 'Hello Wor=A9ld'))        # => Hello Wor=A9ld
    

    online Python demo

    这里,

    • ^abc - abc 仅在字符串的开头

    • | - 或

    • (?<=^abc.*?) - 检查输入开头是否有 abc ,然后是当前位置左侧的换行符以外的任何数量的字符

    • =[A-Z0-9]+ - = 后跟1个大写ASCII字母/数字 .

  • 2

    这对我有用 .

    re.sub(r'^(abc)(.*?)(=[A-Z0-9]+)(.*?)$', r"\2\4", str)
    
  • 1

    这是一种天真的方法,但为什么你不能使用 replace 两次而不是正则表达式,如下所示:

    str = str.replace('abc','')
    str = str.replace('=A9','')
    
    print(str) #'Hello World'
    

相关问题