【问题标题】:Find regex matches & remove outer part of the match查找正则表达式匹配并删除匹配的外部部分
【发布时间】:2023-09-09 10:52:01
【问题描述】:

我有一个字符串

content = "std::cout << func(some_val) << std::endl; auto i = func(some_other_val);"

我发现找到所有带有func(...) 的实例,并删除函数调用。这样我就会得到

content = "std::cout << some_val << std::endl; auto i = some_other_val;"

所以我试过这个:

import re
content = "std::cout << func(some_val) << std::endl; auto i = func(some_other_val);"
c       = re.compile('func\([a-zA-Z0-9_]+\)')

print(c.sub('', content))           # gives "std::cout <<  << std::endl; auto i = ;"

但这会删除整个匹配项,而不仅仅是 func()

基本上,我如何保留与[a-zA-Z0-9_]+ 匹配的内容?

【问题讨论】:

    标签: regex python-3.x string


    【解决方案1】:

    您可以使用re.sub 将所有外部func(...) 替换为仅如下所示的值,请参见正则表达式here,这里我使用了[w]+,如果使用,您可以进行更改

    import re
    regex = r"func\(([\w]+)\)"
    
    test_str = "std::cout << func(some_val) << std::endl; auto i = func(some_other_val);"
    subst = "\\1"
    result = re.sub(regex, subst, test_str, 0, re.MULTILINE)
    if result:
        print (result)
    

    演示: https://rextester.com/QZJLF65281

    输出:

    std::cout << some_val << std::endl; auto i = some_other_val;
    

    【讨论】:

      【解决方案2】:

      您应该捕获要保留到组中的匹配部分:

      re.compile(r'func\(([a-zA-Z0-9_]+)\)')
      

      在这里我将它捕获到第 1 组。

      然后您可以使用\1 引用第 1 组:

      print(c.sub(r'\1', content))
      

      请注意,一般情况下,您不应该使用正则表达式来解析具有正则表达式的非常规语言(例如本例中的 C)的源代码。它可能适用于输入非常有限的一些非常特殊的情况,但您仍应使用 C 解析器来解析 C 代码。我找到了诸如thisthis 之类的库。

      【讨论】: