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

时间:2017-06-28 10:29:07

标签: python regex

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

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

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

str = str.replace('abc','')
str = str.replace('=A9','')

print(str) #'Hello World'

答案 2 :(得分:2)

这对我有用。

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

答案 3 :(得分:1)

  

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

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

我建议:

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字母/数字。