Python正则表达式:修复后向断言固定宽度错误
Python中适配可变长度前置匹配的正则修改方案
问题原因
你的正则在Python中报错,是因为Python的re模块要求后向断言(lookbehind)必须是固定长度,而原正则里的0_ASW和10_BSW长度不同(前者5字符,后者6字符),导致整个后向断言的长度不固定,触发了A lookbehind assertion has to be fixed width错误。而.NET正则引擎支持可变长度后向断言,所以原正则在C#中可以正常运行。
两种可行的修改方案
方案1:拆分多个固定长度的后向断言
Python允许在同一个后向断言中使用多个固定长度的分支,我们可以把两种前缀的情况分开写,每个分支都是固定长度:
正则表达式:
(?<=\\0_ASW\\)([A-Za-z0-9]+)|(?<=\\10_BSW\\)([A-Za-z0-9]+)
Python代码示例:
import re paths = [ r"C:\MyPath\0_ASW\Mod2000", r"C:\MyPath\10_BSW\ModA\SubDir", r"C:\MyPath\10_BSW\ModB" ] pattern = re.compile(r'(?<=\\0_ASW\\)([A-Za-z0-9]+)|(?<=\\10_BSW\\)([A-Za-z0-9]+)') for path in paths: match = pattern.search(path) if match: # 取第一个非空的捕获组 print(match.group(1) or match.group(2))
方案2:放弃后向断言,直接匹配前缀并捕获目标
这种写法更直观,兼容性也更强(所有正则引擎都支持),直接匹配前缀\0_ASW\或\10_BSW\,然后捕获后面的字母数字串:
正则表达式:
\\(0_ASW|10_BSW)\\([A-Za-z0-9]+)
Python代码示例:
import re paths = [ r"C:\MyPath\0_ASW\Mod2000", r"C:\MyPath\10_BSW\ModA\SubDir", r"C:\MyPath\10_BSW\ModB" ] pattern = re.compile(r'\\(0_ASW|10_BSW)\\([A-Za-z0-9]+)') for path in paths: match = pattern.search(path) if match: # 提取第二个捕获组的内容 print(match.group(2))
两种方案都能正确提取出Mod2000、ModA、ModB,其中方案2代码更简洁,推荐使用。
内容的提问来源于stack exchange,提问作者SimpleThings
相关产品推荐
相关产品推荐

