解决一个python regex bug ^H^H^H…啊哼…需要错误的特性

2024-04-25 20:58:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些生成正则表达式的代码。实际上,下面的表达式是:

^(?:\s*((exclude|include|hide|show|protect|risk|dir-merge|merge)),\s*((-|+|H|S|P|R|:|.))\s*(\S+)|\s*,?\s*((-|+|H|S|P|R|:|.))\s*(\S+)|\s*((exclude|include|hide|show|protect|risk|dir-merge|merge))\s*(\S+))$

它看起来很复杂,但本质上是为了匹配文件中的以下行:

dir-merge, :    /some/file
   merge,   . /some/other/file
. /another/file
 , :    /yet/another/file

因此\s*匹配导致Python regex编译错误。你知道吗

有没有更好的方法在单个表达式中匹配这些组合而不匹配nothing块?你知道吗

回答

除了答案之外,值得一提的是,我通过形成以下表达式来解决这个问题:

^(?:\s*(exclude|include|hide|show|protect|risk|dir-merge|merge),\s*([-+HSPR:.])\s*(\S+)|\s*,?\s*([-+HSPR:.])\s*(\S+)|\s*(exclude|include|hide|show|protect|risk|dir-merge|merge)\s*(\S+))$

微小的差别是从(-|+|H|S|P|R|:|.)([-+HSPR:.])的转变。方括号的作用是转义字符,防止|+表达式匹配nothing。你知道吗


Tags: 代码include表达式showdiranothersomemerge
1条回答
网友
1楼 · 发布于 2024-04-25 20:58:32

你似乎有不止一个问题。“无需重复”可以很容易地复制:

>>> re.compile("|+")
Traceback (most recent call last):
...
sre_constants.error: nothing to repeat

+表示“匹配前面的一个或多个”,但在+前面有一个空字符串。你的意思可能是在几个地方说\+,而不是普通的+。你知道吗

相关问题 更多 >