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字符作为有效空间),但模式不断破坏。
答案 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。