【问题标题】:Python - regex, blank element at the end of the list?Python - 正则表达式,列表末尾的空白元素?
【发布时间】:2023-03-22 10:38:01
【问题描述】:

我有密码

print(re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!"))

结果

['Holy', 'moly', 'feferoni', '']

我怎样才能摆脱最后一个空白元素,是什么原因造成的? 如果这是从字符串中去除标点符号和空格的一种肮脏方式,那么除了使用正则表达式之外,我还能怎么写?

【问题讨论】:

  • 首先,没有必要在字符类[\s?!,;]+中转义那些字符。您也可以尝试匹配而不是拆分,只需创建一个负字符类[^\s?!,;]+

标签: python regex python-3.x split


【解决方案1】:

扩展@HamZa 在他的comment 中所说的内容,您将使用re.findall 和一个否定字符集:

>>> from re import findall
>>> findall(r"[^\s?!,;]+", "Holy moly, feferoni!")
['Holy', 'moly', 'feferoni']
>>>

【讨论】:

    【解决方案2】:

    您将空字符串作为列表的最后一个元素,因为 RegEx 在最后一个 ! 之后拆分。它最终会为您提供! 之前的内容和之后的内容,但是在它之后,什么都没有,即一个空字符串!如果您没有明智地将+ 添加到您的正则表达式中,您可能会在字符串中间遇到同样的问题。

    如果您无法使用迭代器,请添加对 list 的调用。如果您想优雅地摆脱可选的空字符串,请执行以下操作:

    filter(None, re.split(r"[\s?!,;]+", "Holy moly, feferoni!"))
    

    这将导致:

    ['Holy', 'moly', 'feferoni']
    

    这样做是删除所有不是True 值的元素。过滤器函数通常只返回满足作为函数给出的要求的元素,但如果你传递None,它将检查值本身是否为True。因为空字符串是False,而其他所有字符串都是True,所以它会从列表中删除所有空字符串。

    还请注意,我删除了字符类中特殊字符的转义,因为它根本没有必要,只会使 RegEx 更难阅读。

    【讨论】:

      【解决方案3】:

      我首先想到的是这样的:

      >>> mystring = re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!")
      ['Holy', 'moly', 'feferoni', '']
      >>> mystring.pop(len(mystring)-1)
      
      >>> print mystring
      ['Holy', 'moly', 'feferoni']
      

      【讨论】:

        【解决方案4】:
        __import__('re').findall('[^\s?!,;]+', 'Holy moly, feferoni!')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-26
          • 2010-11-23
          • 2011-03-14
          • 1970-01-01
          • 2014-02-23
          • 2013-10-30
          相关资源
          最近更新 更多