我需要Python2中的正则表达式才能匹配水平白色空格而不是换行符。
\ s匹配包括换行符在内的所有空格。
>>> re.sub(r"\s", "", "line 1.\nline 2\n")
'line1.line2'
\ h根本不起作用。
>>> re.sub(r"\h", "", "line 1.\nline 2\n")
'line 1.\nline 2\n'
[\ t]有效,但我不确定我是否遗漏了其他可能的空白字符,特别是在Unicode中。如\ u00A0(非破空间)或\ u200A(发空间)。以下链接中有更多空白字符。 https://www.cs.tut.fi/~jkorpela/chars/spaces.html
>>> re.sub(r"[\t ]", "", u"line 1.\nline 2\n\u00A0\u200A\n", flags=re.UNICODE)
u'line1.\nline2\n\xa0\u200a\n'
你有什么建议吗?
我最终使用[^ \ S \ n]而不是指定所有Unicode空格。
>>> re.sub(r"[^\S\n]", "", u"line 1.\nline 2\n\u00A0\u200A\n", flags=re.UNICODE)
u'line1.\nline2\n\n'
>>> re.sub(r"[\t ]", "", u"line 1.\nline 2\n\u00A0\u200A\n", flags=re.UNICODE)
u'line1.\nline2\n\xa0\u200a\n'
它按预期工作。
如果您只想匹配实际空格,请尝试使用简单的( )+
(括号仅为了可读性*)。如果要匹配空格和制表符,请尝试[ \t]+
(+
,以便您也匹配例如3个空格字符的序列。
现在在unicode中实际上有其他空白字符,这是真的。但是,您很可能不会遇到任何书面代码中的任何内容,并且在其他文本中也不太可能遇到任何不太常见的空白字符。
如果你愿意,你可以包括\u00A0
(不间断的空间,在科学论文和一些网站上相当常见。这是HTML
),en-space \u2002
( 
),em-space \u2003
( 
)或稀薄的空间\u2009
( 
)。
您可以在Wikipedia上找到各种其他unicode空白字符,但我非常怀疑是否有必要包含它们。我只是坚持空间,标签和可能不间断的空间(即[ \t\u00A0]+
)。
无论如何,你打算与\h
匹配什么?据我所知,它不是正则表达式中的有效“符号”。
* Stackoverflow不在内联代码的边缘显示空格
由于垂直空白字符(行终止符)少于水平空格字符,因此将第一类别列入黑名单比将第二类别列入白名单更短。但你仍然需要列出a few more而不仅仅是\n
:
[^\S\n\v\f\r\u2028\u2029]