使用正则表达式修改Python列表失效,求排查原因
正则替换未生效的问题排查与解决
问题描述
我正在编辑一个自定义列表,列表内容如下:
['\n//POINTER #1 @ $3BA4 - STRING #1 @ $3DD3\n#W32($3BA4)\n・All enemies defeated[END-FE]', '\n//POINTER #2 @ $3BA8 - STRING #2 @ $3DEC\n#W32($3BA8)\n・Follower dies[NLINE]\n・All party members die[END-FE]', '\n//POINTER #3 @ $3BAC - STRING #3 @ $3E17\n#W32($3BAC)\n・Follower dies[NLINE]\n・All party members die[END-FE]', '\n//POINTER #4 @ $3BB0 - STRING #4 @ $3E42\n#W32($3BB0)\n・All party members die[END-FE]']
我想要替换每个列表项中格式为 //POINTER #X @ $XXXX - STRING #X @ $XXXX\n 的内容,尝试了以下代码,在regex101测试中正则能匹配所有目标项,但实际运行未完成替换:
import re engfile_chunks = [<list above>] engfile_chunks_new = [re.sub(r'(\\n//POINTER).+?(?=\\n)', '', chunks) for chunks in engfile_chunks]
原因分析
问题出在正则表达式的转义处理上:
- 在Python的原始字符串(raw string)中,
\\n会被保留为字面量的\n字符组合,而你的列表项里的换行是真实的换行符(\n),不是字面量字符串,导致正则无法匹配到目标内容。 - 你在regex101中测试时,输入的是字面量的
\n,和Python中实际存储的真实换行符不一致,所以测试能匹配但实际运行失效。
解决方法
把正则表达式里的 \\n 改成 \n,直接匹配真实换行符即可:
import re engfile_chunks = [ '\n//POINTER #1 @ $3BA4 - STRING #1 @ $3DD3\n#W32($3BA4)\n・All enemies defeated[END-FE]', '\n//POINTER #2 @ $3BA8 - STRING #2 @ $3DEC\n#W32($3BA8)\n・Follower dies[NLINE]\n・All party members die[END-FE]', '\n//POINTER #3 @ $3BAC - STRING #3 @ $3E17\n#W32($3BAC)\n・Follower dies[NLINE]\n・All party members die[END-FE]', '\n//POINTER #4 @ $3BB0 - STRING #4 @ $3E42\n#W32($3BB0)\n・All party members die[END-FE]' ] engfile_chunks_new = [re.sub(r'\n//POINTER.+?(?=\n)', '', chunks) for chunks in engfile_chunks] # 验证结果 for item in engfile_chunks_new: print(repr(item))
运行后每个列表项里的指针注释行都会被正确移除,输出结果为:
'#W32($3BA4)\n・All enemies defeated[END-FE]' '#W32($3BA8)\n・Follower dies[NLINE]\n・All party members die[END-FE]' '#W32($3BAC)\n・Follower dies[NLINE]\n・All party members die[END-FE]' '#W32($3BB0)\n・All party members die[END-FE]'
如果想连列表项开头的空换行也一起去掉,可以调整正则为 r'^\n//POINTER.+?(?=\n)',通过 ^ 锚定行首,精准匹配开头的目标内容。
内容的提问来源于stack exchange,提问作者Murow
相关产品推荐
相关产品推荐

