Python Regex -lookbehindAssert必须具有固定宽度

isr3a4wc  于 2023-01-21  发布在  Python
关注(0)|答案(3)|浏览(108)

我想从路径中提取一个特定的字符串。所需的字符串总是以\0_ASW\\10_BSW\单词开头。另外,所需的字符串只包含字母和数字。
例如,从下面3个路径中,我想提取字符串Mod2000ModAModB

C:\MyPath\0_ASW\Mod2000
C:\MyPath\10_BSW\ModA\SubDir
C:\MyPath\10_BSW\ModB

为此,我使用正向后看编写了一个正则表达式:

\\(?<=(0_ASW|10_BSW)\\)([A-Za-z0-9]+)

有了这个正则表达式,第二组匹配的字符串正确,我能够编译正则表达式在**.NET(C#)**没有任何错误。然而,一旦我试图编译它在Python我得到以下正则表达式错误:A lookbehind assertion has to be fixed width
根据我的理解,正向lookbehind中的两个字,即0_ASW10_BSW应该具有固定长度,错误对我来说不明显,因为这两个字分别具有4个和5个字符的固定长度,如果我试图使这两个字符串具有相等的长度,例如3个字符串ASWBSW。正则表达式编译时不会出现上述错误。

\\(?<=(ASW|BSW)\\)([A-Za-z0-9]+)

我如何修正这个正则表达式,使它也能用Python编译?
您可以在此处找到演示:
https://regex101.com/r/qfwfJJ/1
https://regex101.com/r/zAVk5Z/1

4si2a6ki

4si2a6ki1#

您也可以使用non-capturing group

\\(?:0_ASW|10_BSW)\\(\w+)

https://regex101.com/r/hYCRJf/1
如果正则表达式匹配,您将在group(1)中得到所需的字符串。

hmae6n7t

hmae6n7t2#

你可以使用像这样的一个交替的前瞻,因为对于Python,它必须是固定的宽度,这在你的模式中没有。

\b(?:(?<=\\0_ASW\\)|(?<=\\10_BSW\\))[A-Za-z0-9]+

参见regex101 demo
如果你可以使用PyPi regex module,你匹配你想要的,然后你可以使用\K忘记什么是匹配到目前为止:

\\(?:0_ASW|10_BSW)\\\K[A-Za-z0-9]+

参见另一个regex101 demo

相关问题