我尝试使用标志 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。你有什么想法吗?
答案 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