2

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

^(?:\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 正则表达式编译错误的匹配项。

有没有更好的方法来匹配单个表达式中的这些组合而不匹配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

4

1 回答 1

5

你在这里似乎有不止一个问题。“没什么可重复的”可以很容易地复制:

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

+表示“匹配前面的一个或多个”,但前面有一个空字符串+。您可能的意思是\+在几个地方而不是 plain +

于 2013-10-22T21:24:52.277 回答