为什么 re.sub 不适用于多行模式下的所有匹配?

问题描述 投票:0回答:1

我正在使用正则表达式使用 python 解析文件的内容。我使用

re.sub
在解析之前删除注释,方法是删除以
#
开头的任何行中的任何文本。

import re

filetext = """
# This is the contents of a file

var: 800  # A var I defined

# This is a comment
    # Indented comment

# Use "=" to set parameters explicitly

param1 = 123
param2 = 456

# Block of code

block1: {
    # var_name = val
    var1 = 7
    var2 = 9
}

# Block of code 2

block2: {
    # var_name = val
    var1 = 7
    var2 = 9
}
"""

scrubbed_text = re.sub(r'#.*', '', filetext, re.M)

print(scrubbed_text)

输出:


var: 800






param1 = 123
param2 = 456



block1: {

    var1 = 7
    var2 = 9
}



block2: {
    # var_name = val
    var1 = 7
    var2 = 9
}

它会删除文本中的每一条注释,除了末尾“block2”内的注释。如果我从

re.M
调用中删除
re.sub
,它将删除所有评论,这正是我想要的。

这种行为让我感到困惑。为什么

re.M
多行模式会导致跳过一场匹配?

python regex comments python-re
1个回答
0
投票

因为您将

re.M
放入
count=
参数
。如果您执行
print(int(re.M))
,您将看到 8 - 因此
re.sub
将仅替换前 8 个出现的位置。

试试这个:

scrubbed_text = re.sub(r'#.*', '', filetext, flags=re.M)
© www.soinside.com 2019 - 2024. All rights reserved.