Python re.sub多线上字符串

时间:2015-11-24 09:33:18

标签: python regex replace

我尝试使用标志 re.MULTILINE

我阅读了这些帖子:Bug in Python Regex? (re.sub with re.MULTILINE)Python re.sub MULTILINE caret match但它不起作用。 代码:

https://bitbucket.org/ownerName/repositoryName/get/A0B1C2D.zip

代码输出:

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)

new_txt 不应包含多行注释。 我想获得没有多行注释的txt。你有什么想法吗?

1 个答案:

答案 0 :(得分:5)

您需要将re.MULTILINE替换为re.DOTALL / re.S,并将字符类外的句点移出其中,该点与文字.匹配。

请注意,re.MULTILINE仅重新定义了在{em>行的开头/结尾强制匹配的^$的行为,而不是整个串。 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)

请参阅IDEONE demo

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

/\*+[^*]*(?:\*(?!/)[^*]*)*\*/

请参阅regex demo