正则表达式匹配水平空白区域

时间:2017-09-07 12:14:57

标签: regex python-2.7 unicode python-unicode

我需要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'

你有什么建议吗?

3 个答案:

答案 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]