jdh*_*hao 2 python regex unicode ascii
我是 Python 正则表达式新手,正在尝试匹配 Python 中的非空白 ASCII 字符。
\n\n以下是我的代码:
\n\nimpore 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?\nRun Code Online (Sandbox Code Playgroud)\n\n我已经在 中指定了 ASCII 模式re.compile,但p.search(\'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97\')仍然有结果。我想知道我在这里做错了什么?
该re.A标志仅影响速记字符类匹配的内容。
在 Python 3.x 中,速记字符类支持 Unicode,Python 2.x re.UNICODE/re.U默认为 ON。这意味着:
\\d:匹配任何 Unicode 十进制数字(即 Unicode 字符类别[Nd]中的任何字符)\\D:匹配任何非十进制数字的字符。Nd(因此,除Unicode 类别中的字符外的所有字符)。\\w -匹配 Unicode 单词字符;这包括可以作为任何语言的单词一部分的大多数字符,以及数字和下划线。(因此,\\w+匹配My name is \xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80字符串中的每个单词)\\W-匹配任何不是单词字符的字符。这与\\w. (因此,它不会匹配任何 Unicode 字母或数字。)\\s-匹配 Unicode 空白字符(它将匹配NEL、 硬空格等)\\S-匹配任何非空白字符的字符。(因此,无法匹配NEL、硬空间等)\\b- 单词边界匹配 Unicode 字母/数字和非字母/数字或字符串的开头/结尾之间的位置。\\B- 非单词边界匹配两个 Unicode 字母/数字、两个非字母/数字之间或 Unicode 非字母/数字与字符串开头/结尾之间的位置。如果您想禁用此行为,请使用re.A或re.ASCII:
\n\n\n使
\n\\w、\\W、\\b、\\B、\\d、\\D、\\s执行\\S仅 ASCII 匹配,而不是完整的 Unicode 匹配。这仅对 Unicode 模式有意义,而对于字节模式则被忽略。对应于内联标志(?a)。
这意味着:
\n\n\\d= [0-9]- 且不再匹配印地语、孟加拉语等数字\\D= [^0-9]- 并匹配 ASCII 数字以外的任何字符(即它的作用与(?u)(?![0-9])\\d现在一样)\\w= [A-Za-z0-9_]- 现在只匹配 ASCII 单词,Wiktor与 匹配\\w+,但\xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80不匹配\\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等)\\s= [ \\t\\n\\r\\f\\v]- 匹配常规空格、制表符、换行符、回车符、换页符和垂直制表符\\S= [^ \\t\\n\\r\\f\\v]- 匹配除空格、制表符、换行符、回车符、换页符和垂直制表符之外的任何字符,因此它匹配所有 Unicode 字母、数字和标点符号以及 Unicode(非 ASCII)空白。例如,re.sub(r\'\\S+\', r\'{\\g<0>}\', \'\\xA0 \', flags=re.A)将返回\'{ } \',如您所见,\\S现在匹配硬空间。| 归档时间: |
|
| 查看次数: |
6037 次 |
| 最近记录: |