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

问题描述 投票:7回答:3

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

你有什么建议吗?

regex python-2.7 unicode python-unicode
3个回答
7
投票

我最终使用[^ \ 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
投票

如果您只想匹配实际空格,请尝试使用简单的( )+(括号仅为了可读性*)。如果要匹配空格和制表符,请尝试[ \t]++,以便您也匹配例如3个空格字符的序列。

现在在unicode中实际上有其他空白字符,这是真的。但是,您很可能不会遇到任何书面代码中的任何内容,并且在其他文本中也不太可能遇到任何不太常见的空白字符。

如果你愿意,你可以包括\u00A0(不间断的空间,在科学论文和一些网站上相当常见。这是HTML  ),en-space \u2002 ),em-space \u2003 )或稀薄的空间\u2009 )。

您可以在Wikipedia上找到各种其他unicode空白字符,但我非常怀疑是否有必要包含它们。我只是坚持空间,标签和可能不间断的空间(即[ \t\u00A0]+)。

无论如何,你打算与\h匹配什么?据我所知,它不是正则表达式中的有效“符号”。

* Stackoverflow不在内联代码的边缘显示空格


0
投票

由于垂直空白字符(行终止符)少于水平空格字符,因此将第一类别列入黑名单比将第二类别列入白名单更短。但你仍然需要列出a few more而不仅仅是\n

[^\S\n\v\f\r\u2028\u2029]
© www.soinside.com 2019 - 2024. All rights reserved.