【问题标题】:Regex to Match Horizontal White Spaces正则表达式匹配水平空格
【发布时间】:2018-02-16 04:13:05
【问题描述】:

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


    【解决方案1】:

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

    它按预期工作。

    【讨论】:

    • flags=re.UNICODE 很重要。
    • @CarsonIp for python2,是的。对于 Py3,没那么多
    【解决方案2】:

    如果您只想匹配实际空格,请尝试使用普通的( )+(括号仅供阅读*)。如果您想匹配空格和制表符,请尝试[ \t]+ (+,这样您还可以匹配例如 3 个空格字符的序列。

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

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

    您可以在 Wikipedia 上找到各种其他 unicode 空白字符,但我非常怀疑是否有必要包含它们。我会坚持使用空格、制表符,也许还有不间断的空格(即[ \t\u00A0]+)。

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

     

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

    【讨论】:

    • 使用 [^\S\n] 怎么样?
    • @MemduhÇağrıDemir 这实际上是一个非常聪明的解决方案,它应该可以按需要工作。不过,您仍然希望在末尾添加加号 - 否则一系列空格将被计为单独匹配而不是单个匹配 ([^\S\n]+)
    【解决方案3】:

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

    [^\S\n\v\f\r\u2028\u2029]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2010-10-08
      • 2020-08-22
      • 2014-03-25
      • 1970-01-01
      相关资源
      最近更新 更多