我是Python正则表达式的新手,正在尝试匹配Python中的非空白ASCII字符。
以下是我的代码:
impore re
p = re.compile(r"[\S]{2,3}", re.ASCII)
p.search('1234') # have some result
p.search('你好吗') # also have result, but Why?
我在中指定了ASCII模式re.compile
,但p.search('你好吗')
仍然有结果。我想知道我在做什么错吗?
该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 Виктор
字符串中的每个单词)\W
-匹配不是单词字符的任何字符。这与的相反\w
。(因此,它将不匹配任何Unicode字母或数字。)\s
-匹配Unicode空格字符(它将匹配NEL
,硬空格等)\S
-匹配不是空格字符的任何字符。(因此,无法匹配NEL
,硬空间等)\b
-字边界匹配Unicode字母/数字和非字母/数字或字符串的开头/结尾之间的位置。\B
-非单词边界匹配两个Unicode字母/数字,两个非字母/数字之间或Unicode非字母/数字与字符串开头/结尾之间的位置。如果要禁用此行为,请使用re.A
或re.ASCII
:
让
\w
,\W
,\b
,\B
,\d
,\D
,\s
和\S
执行ASCII-只匹配完整的Unicode匹配代替。这仅对Unicode模式有意义,而对于字节模式则忽略。对应于内联标志(?a)
。
这意味着:
\d
= [0-9]
-不再匹配印地语,孟加拉语等数字\D
= [^0-9]
-并匹配ASCII数字以外的任何其他字符(即,它像(?u)(?![0-9])\d
现在一样)\w
= [A-Za-z0-9_]
-并且现在仅匹配ASCII字,Wiktor
与匹配\w+
,但Виктор
不匹配\W
= [^A-Za-z0-9_]
-它匹配任何字符,但ASCII字母/数字/ _
(即它匹配你好吗
,Виктор
等等。\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
现在匹配硬空间。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句