Perl与Python中带m标志的正则表达式行为差异及适配方案
Perl转Python正则替换问题:解决末尾多余的
[stamp] 问题分析
Perl代码里的s/^/$stamp/gm会给每行开头添加[stamp],但原字符串"message\n"末尾的换行不会触发额外替换——Perl的m修饰符不会把字符串末尾换行后的空位置认定为新行开头。
而Python的re.M(多行模式)下,^会匹配所有换行符之后的位置,包括字符串末尾换行符后的空位置,这就导致结果多了一个[stamp]。
解决方案
修改正则表达式,用正向预查(?=.)只匹配后面有内容的行开头,排除空行:
import re message = "message\n" stamp = "[stamp]" result = re.sub(re.compile("^(?=.)", re.M), stamp, message) print(repr(result)) # 输出: '[stamp]message\n'
也可以直接传入模式字符串,不用预编译正则:
import re result = re.sub("^(?=.)", "[stamp]", "message\n", flags=re.M)
这样就能和Perl代码的行为完全一致,仅给有内容的行开头添加标记,不会在末尾换行后的空位置额外生成[stamp]。
内容的提问来源于stack exchange,提问作者snoopyjc
相关产品推荐
相关产品推荐

