You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:05:26