在Python中从regex模式获取多个匹配项

时间:2011-06-24 20:13:57

标签: python regex escaping backslash backreference

我正在编写一个正则表达式,以类似于shell参数的方式解析参数,使用空格和带引号的字符串作为分隔符,以及反斜杠转义。这似乎适用于RegexPal

(?:(["'])(?:\\(?:\\\\)?\1|\\\\|.)*?\1|(?:\\(?:\\\\)?\s|\\\\|\S)+)

这是一个更具可读性的版本:

(?:(["'])(?:        # Match a double or single quote followed by
     \\(?:\\\\)?\1  #   an odd number of backslashes, then the same quote
    |\\\\           #   or two backslashes
    |.              #   or anything else  
    )*?\1           # any number of times (lazily) followed by the same quote,
|(?:                # OR
     \\(?:\\\\)?\s  #   an odd number of backslashes, then whitespace
    |\\\\           #   or two backslashes
    |\S             #   or any non-whitespace
 )+                 # any number of times.
)

我尝试用re.findall将它放到Python中,但输出是无意义的:

>>> re.findall(
... r"(?:([\"'])(?:\\(?:\\\\)?\1|\\\\|.)*?\1|(?:\\(?:\\\\)?\s|\\\\|\S)+)",
... r'the quick brown\ fox jumps "over the" lazy\\ dog')
['', '', '', '', '"', '', '']
另一方面,

RegexPal显示正确的结果:

[the] [quick] [brown\ fox] [jumps] ["over the"] [lazy\\] [dog]

我是否忘记以某种方式为Python格式化模式?或者Python以某种方式解释正则表达式有何不同?我不知道为什么唯一的非空匹配将是双引号,并且我已经确认模式本身的工作方式应该如此。

1 个答案:

答案 0 :(得分:2)

看起来一切都在非捕获组内。所以你得到匹配,没有匹配的内容。