字符串上的Python re.sub多行

Sam*_*zon 8 python regex replace

我尝试使用标志re.MULTILINE

我读了这些帖子:Python Regex中的Bug?(带有re.MULTILINE的re.sub)Python re.sub MULTILINE脱字符号匹配,但是它不起作用。代码 :

import re
if __name__ == '__main__':

    txt = "\n\
<?php\n\
/* Multi-line\n\
comment */\n\
$var = 1;\n"
    new_txt = re.sub(r'\/\*[.\n]*?\*\/', '', txt, flags=re.MULTILINE)
    print("\n=========== TXT ============")
    print(txt)
    print("\n=========== NEW TXT ============")
    print(new_txt)
Run Code Online (Sandbox Code Playgroud)

代码输出:

=========== TXT ============

<?php
/* Multi-line
comment */
$var = 1;


=========== NEW TXT ============

<?php
/* Multi-line
comment */
$var = 1;
Run Code Online (Sandbox Code Playgroud)

但是new_txt不应包含多行注释。我想获取没有多行注释的txt。你有什么主意吗 ?

Wik*_*żew 10

您需要re.MULTILINEre.DOTALL/ 替换,re.S并在字符类外移出句点,因为它在字符类内,点与文字匹配.

请注意,re.MULTILINE只有重新定义的行为^$被强制匹配在开始/结束线,而不是整个字符串。该re.DOTALL标志仅在字符类外部重新定义.模式内部的行为。它也开始匹配换行符。

因此,您可以在当前示例中使用的正则表达式:/\*.*?\*/。它相匹配的文字/*/\*,然后.*?尽可能少的任何符号尽可能至多并包括相匹配*/(具有匹配\*/)。

参见代码演示:

txt = """\n\
<?php\n\
/* Multi-line\n\
comment */\n\
$var = 1;\n"""
new_txt = re.sub(r'/\*.*?\*/', '', txt, flags=re.S)
print("\n=========== TXT ============")
print(txt)
print("\n=========== NEW TXT ============")
print(new_txt)
Run Code Online (Sandbox Code Playgroud)

IDEONE演示

但是,它不是最佳解决方案,因为在大多数情况下,多行注释很长。最好是展开循环技术。上面的正则表达式可以像这样“展开”:

/\*[^*]*(?:\*(?!/)[^*]*)*\*/
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

  • 仅供参考:此解决方案不支持嵌套多行注释。 (3认同)
  • @alexroat如果您需要更好的性能,请使用`/\*[^*]*(?:\*(?!/)[^*]*)*\*/` (3认同)