字符串上的Python re.sub多行
问题内容:
我尝试使用标志 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)
代码输出:
=========== TXT ============
<?php
/* Multi-line
comment */
$var = 1;
=========== NEW TXT ============
<?php
/* Multi-line
comment */
$var = 1;
但是 new_txt 不应包含 多行注释 。我想获取没有多行注释的txt。你有什么主意吗 ?
问题答案:
您需要re.MULTILINE
用re.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)
但是,它不是最佳解决方案,因为在大多数情况下,多行注释非常长。最好是 展开循环 技术。上面的正则表达式可以像这样“展开”:
/\*[^*]*(?:\*(?!/)[^*]*)*\*/