代码之家  ›  专栏  ›  技术社区  ›  eazyezy

如何在字符串中使用正则表达式捕获重复模式?

  •  1
  • eazyezy  · 技术社区  · 1 年前

    我有一堆这样的字符串: abc#axyz(abc#axyz#a#aabc)abc#axyz 。我需要做的是删除所有 #a 括号内的内容应保留在文本中,括号外的内容应保持不变。我尝试了以下方法:

    \((.*?)(#a)(.*?)\)
    

    但它只捕捉到了第一次重复。我做错了什么?感谢您的任何意见!

    3 回复  |  直到 1 年前
        1
  •  2
  •   no comment Pratyush Goutam    1 年前

    我可能只是找到括号内的部分,然后作为单独的步骤进行替换。

    import re
    
    s = "abc#axyz(abc#axyz#a#aabc)abc#axyz"
    
    out = re.sub(r'\(.*\)', lambda m: m[0].replace('#a', ''), s)
    print(out)
    

    Attempt This Online!

        2
  •  2
  •   Vikram Kamble    1 年前

    您也可以使用此方法:

    import re
    
    s = "abc#axyz(abc#axyz#a#aabc)abc#axyz"
    
    out = re.sub(r'\(([^)]*)\)', lambda m: '(' + m.group(1).replace('#a', '') + ')', s)
    print(out) 
    
    
        3
  •  1
  •   Andrej Kesely    1 年前

    试试看( regex101 link ):

    import re
    
    s = "abc#axyz(abc#axyz#a#aabc)abc#axyz"
    
    out = re.sub(r"#a(?=.*\))(?!.*\()", "", s)
    print(out)
    

    打印:

    abc#axyz(abcxyzabc)abc#axyz