【问题标题】:Replace captured groups with empty string in python在python中用空字符串替换捕获的组
【发布时间】:2017-06-28 10:29:06
【问题描述】:

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

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”?

【问题讨论】:

  • 捕获您想要保留的内容,而不捕获您想要删除的内容。在替换字符串中使用对捕获组的引用。
  • 也许您想替换多次出现的=[A-Z0-9]+?那就试试re.sub(r'^abc|=[A-Z0-9]+', '', s)
  • @WiktorStribiżew 有没有一种方法可以让我使用你的正则表达式,同时确保 abc 存在,否则不要替换第二个模式?
  • 不是re,你只需要检查字符串是否以abc开头,然后使用re.sub(r'=[A-Z0-9]+', '', s[3:])。或者,如果您使用 PyPi regex 模块,则可以使用 1 个正则表达式。
  • 我用 2 个解决方案添加了我的答案:1)基于 Python re,分 2 个步骤,2)基于无限宽度后向模式的 PyPi。

标签: python regex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • str.replace 将不起作用,因为 OP 需要删除 (=[A-Z0-9]+) 可能不是 =A9。但是re.sub 两次可能会起作用,具体取决于具体要求。
    • 好的。在他提到的问题中,他想找到组“abc”和“=A9”。这让我得到了这个答案。
    【解决方案3】:

    这对我有用。

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

    【讨论】:

    • 在此解决方案中,我该如何更改它以删除 (=[A-Z0-9]+) 的多个实例并保留其他文本?我需要多个组?例如这个字符串:'abcHel=A5lo Wor=A9ld'
    • 你可以通过print re.sub(r'^(abc)(.*?)$', r'\2', re.sub(r'(.*?)=[A-Z0-9]+(.*?)', r'\1\2', str))实现这一目标
    【解决方案4】:

    有没有办法可以..确保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 删除所有不重叠的@ 实例987654333@模式。

    请注意,您可以使用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 仅在字符串的开头
    • | - 或
    • (?&lt;=^abc.*?) - 检查输入开头是否有 abc,然后检查当前位置左侧是否有除换行符以外的任意数量的字符
    • =[A-Z0-9]+ - = 后跟 1+ 个大写 ASCII 字母/数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2018-06-26
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多