奇怪的Python正则表达式问题

时间:2011-04-04 15:50:57

标签: python regex unicode

whitespace_pattern = u"\s" # bug: tried to use unicode \u0020, broke regex

time_sig_pattern = \
    """^%(ws)s*time signature:%(ws)s*(?P<top>\d+)%(ws)s*\/%(ws)s*(?P<bottom>\d+)%(ws)s*$""" %{"ws": whitespace_pattern}


time_sig         = compile(time_sig_pattern,         U|M)

出于某种原因,在编译时添加Verbose标志X会破坏模式。

另外,我想使用unicode进行whitespace_pattern识别(据说,我们将获得使用非unicode空间的模式,我们需要明确地检查那个unicode字符作为有效空间),但模式不断破坏。

3 个答案:

答案 0 :(得分:1)

VERBOSE使您能够在正则表达式中编写注释以记录它。

为了做到这一点,它会忽略空格,因为你需要使用换行符来写评论。

将正则表达式中的所有空格替换为\s,以指定它们是您要在模式中匹配的空格,而不只是一些空格来格式化您的注释。

此外,您可能希望将r前缀用作您用作模式的字符串。它告诉Python不要解释诸如\n之类的特殊符号,并允许你使用反斜杠而不转义它们。

答案 1 :(得分:0)

始终使用r前缀定义正则表达式,以指示它们是原始字符串。

 r"""^%(ws)s*time signature:%(ws)s*(?P<top>\d+)%(ws)s*\/%(ws)s*(?P<bottom>\d+)%(ws)s*$""" %{"ws": whitespace_pattern}

答案 2 :(得分:0)

创建正则表达式以匹配unicode字符时,您不想使用Python unicode字符串。在您的示例中,正则表达式需要查看文字字符\u0020,因此您应该使用whitespace_pattern = r"\u0020"而不是u"\u0020"

正如其他答案所提到的,您还应该使用r的{​​{1}}前缀,在这两项更改后,您的代码应该可以正常工作。

要使time_sig_pattern正常工作,您需要转义模式中的所有空格,因此在模式的开头用VERBOSE替换time signature中的空格(为清晰起见,引号), "\ "\s已记录here