我需要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'
你有什么建议吗?
答案 0 :(得分:6)
我最终使用 [^ \ 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'
它按预期工作。
答案 1 :(得分:1)
如果您只想匹配实际空格,请尝试普通( )+
(括号仅为了可读性*)。如果您想匹配空格和标签,请尝试[ \t]+
(+
,以便您也匹配例如3个空格字符的序列。
现在在unicode中实际上有其他空白字符,这是真的。但是,您很可能不会遇到任何书面代码中的任何内容,并且在其他文本中也不太可能遇到任何不太常见的空白字符。
如果您愿意,可以添加\u00A0
(不间断的空间,在科学论文和某些网站上相当常见。这是HTML
),en-space {{1} }(\u2002
),em-space  
(\u2003
)或精简版 
(\u2009
)。
您可以在Wikipedia找到各种其他unicode空白字符,但我非常怀疑是否有必要包含它们。我只是坚持使用空格,制表符和可能不间断的空格(即 
)。
无论如何,您打算与[ \t\u00A0]+
匹配什么?据我所知,它不是正则表达式中的有效“符号”。
* Stackoverflow不在内联代码的边缘显示空格
答案 2 :(得分:0)
由于垂直空白字符(行终止符)少于水平字符,所以将第一类列入黑名单要短于将第二类列入白名单。但是您仍然需要列出a few more而不只是\n
:
[^\S\n\v\f\r\u2028\u2029]