Python 正则表达式:带有 re.ASCII 的模式仍然可以匹配 unicode 字符?

jdh*_*hao 2 python regex unicode ascii

我是 Python 正则表达式新手,正在尝试匹配 Python 中的非空白 ASCII 字符。

\n\n

以下是我的代码:

\n\n
impore re\n\np = re.compile(r"[\\S]{2,3}", re.ASCII)\n\np.search(\'1234\')  # have some result\n\np.search(\'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\') # also have result, but Why?\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经在 中指定了 ASCII 模式re.compile,但p.search(\'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\')仍然有结果。我想知道我在这里做错了什么?

\n

Wik*_*żew 5

re.A标志仅影响速记字符类匹配的内容。

\n\n

在 Python 3.x 中,速记字符类支持 Unicode,Python 2.x re.UNICODE/re.U默认为 ON。这意味着:

\n\n
    \n
  • \\d匹配任何 Unicode 十进制数字(即 Unicode 字符类别[Nd]中的任何字符)
  • \n
  • \\D匹配任何非十进制数字的字符。Nd(因此,除Unicode 类别中的字符外的所有字符)。
  • \n
  • \\w -匹配 Unicode 单词字符;这包括可以作为任何语言的单词一部分的大多数字符,以及数字和下划线。(因此,\\w+匹配My name is \xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80字符串中的每个单词)
  • \n
  • \\W-匹配任何不是单词字符的字符。这与\\w. (因此,它不会匹配任何 Unicode 字母或数字。)
  • \n
  • \\s-匹配 Unicode 空白字符(它将匹配NEL、 硬空格等)
  • \n
  • \\S-匹配任何非空白字符的字符。(因此,无法匹配NEL、硬空间等)
  • \n
  • \\b- 单词边界匹配 Unicode 字母/数字和非字母/数字或字符串的开头/结尾之间的位置。
  • \n
  • \\B- 非单词边界匹配两个 Unicode 字母/数字、两个非字母/数字之间或 Unicode 非字母/数字与字符串开头/结尾之间的位置。
  • \n
\n\n

如果您想禁用此行为,请使用re.Are.ASCII

\n\n
\n

使\\w\\W\\b\\B\\d\\D\\s执行\\S仅 ASCII 匹配,而不是完整的 Unicode 匹配。这仅对 Unicode 模式有意义,而对于字节模式则被忽略。对应于内联标志(?a)

\n
\n\n

这意味着:

\n\n
    \n
  • \\d= [0-9]- 且不再匹配印地语、孟加拉语等数字
  • \n
  • \\D= [^0-9]- 并匹配 ASCII 数字以外的任何字符(即它的作用与(?u)(?![0-9])\\d现在一样)
  • \n
  • \\w= [A-Za-z0-9_]- 现在只匹配 ASCII 单词,Wiktor与 匹配\\w+,但\xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80不匹配
  • \n
  • \\W= [^A-Za-z0-9_]- 它匹配除 ASCII 字母/数字/之外的任何字符_(即它匹配\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97,\xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80等)
  • \n
  • \\s= [ \\t\\n\\r\\f\\v]- 匹配常规空格、制表符、换行符、回车符、换页符和垂直制表符
  • \n
  • \\S= [^ \\t\\n\\r\\f\\v]- 匹配除空格、制表符、换行符、回车符、换页符和垂直制表符之外的任何字符,因此它匹配所有 Unicode 字母、数字和标点符号以及 Unicode(非 ASCII)空白。例如,re.sub(r\'\\S+\', r\'{\\g<0>}\', \'\\xA0 \', flags=re.A)将返回\'{ } \',如您所见,\\S现在匹配硬空间。
  • \n
\n