re.MULTILINE 标志干扰行尾 $ 运算符

re.MULTILINE flag is interfering with the end of line $ operator

抱歉,如果这是一个 duplicate/basic 问题,我找不到任何类似的问题。

我有以下多行字符串

my_txt = """
foo.exe\n
bar.exec\n
abab.exe\n
"""

(换行符实际上并没有写在我的代码中,为了清楚起见,我把它们放在那里)。 我想匹配每个以 .exe(不是 .exec)结尾的文件。 我的正则表达式最初是:

my_reg = re.compile(".+[.](?=exe$)")
my_matches = my_reg.finditer(my_txt)

我希望它会先找到每个字符,然后返回直到找到 .,然后检查是否有字符 exe 和换行符。 只找到一个匹配项,那就是: abab.exe。 我试着弄乱了一下,并更改了第一行: my_reg = re.compile(".+[.](?=exe$)",flags=re.MULTILINE)。 这次成功了运行,返回

foo.
abab.

我认为 re.MULTILINE 不应该干扰 $ 运算符,或者我对 $ operator/misusing 的理解有误吗? 提前致谢!

您确实需要多行标志,否则 $ 将只匹配您输入的绝对结尾。您只需要匹配 exe 而不是使用前瞻:

my_reg = re.compile(".+[.]exe$", re.MULTILINE)

输出:

['foo.exe', 'abab.exe']

Demo

如果您尝试匹配不带扩展名的文件名,您可以将句点放在前瞻中:

my_reg = re.compile(r".+(?=\.exe$)", re.MULTILINE)

输出:

['foo', 'abab']

Demo