【问题标题】:Weird Python Regex Issues奇怪的 Python 正则表达式问题
【发布时间】:2011-04-04 15:50:56
【问题描述】:
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 字符是否为有效空格),但模式不断中断。

【问题讨论】:

    标签: python regex unicode


    【解决方案1】:

    VERBOSE 让您能够在正则表达式中编写 cmets 来记录它。

    为此,它会忽略空格,因为您需要使用换行符来编写 cmets。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        正如其他答案所提到的,您还应该为time_sig_pattern 使用r 前缀,在这两个更改之后,您的代码应该可以正常工作。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 2018-06-03
          • 1970-01-01
          相关资源
          最近更新 更多