【问题标题】:Empty space character after re.splitre.split 后的空白字符
【发布时间】:2017-09-12 20:30:29
【问题描述】:

这是我正在读取的.txt 文件中的一行,我将其分配给x

x = "Wild_lions live mostly in “Africa”"
result = re.split('[^a-zA-Z0-9]+', x)

我最终得到:

['Wild', 'lions', 'live', 'mostly', 'in', 'Africa', ''] # (there's an empty space character as the last element)

为什么最后有一个空格?我意识到我可以通过 result.remove(' ') 来摆脱空间,但对于大文件,我认为这将非常低效。

【问题讨论】:

    标签: python regex split expression


    【解决方案1】:

    你不需要用这个复杂的正则表达式来分割,更简单的是:

    result = re.split('\s+', x)
    result
    # ['Wild_lions', 'live', 'mostly', 'in', '“Africa”']
    

    \s+ 将匹配任意数量的任意空格(制表符、空格、换行符等)。


    如果您只需要字母匹配,最好使用re.compilefindall

    myre = re.compile('[a-zA-Z]+')
    myre.findall(x)
    # ['Wild', 'lions', 'live', 'mostly', 'in', 'Africa']
    

    【讨论】:

    • 但是对于那个例子,我想要从 wild_lions 中取出 _,从 Africa 中取出引号。本质上,我希望输出完全像: ['Wild_lions', 'live', 'mostly', 'in', 'Africa', ''] 没有最后一个空格字符。
    • 工作就像一个魅力。我还想出了另一种使用 re.sub 的方法。我所做的是将所有特殊字符替换为空格,然后将其拆分。这会是更有效的方法吗? :)
    • @dppham1,不,因为在您执行re.sub(r'\W+', ' ', s) 之后,您需要去除空格然后拆分。 3 步与这 1 步。请接受此解决方案。
    【解决方案2】:

    试试这个:

    x = "Wild_lions live mostly in 'Africa'"
    result = re.split('[\s_]+', x)
    

    你会得到:

    ['Wild', 'lions', 'live', 'mostly', 'in', "'Africa'"]
    

    【讨论】:

    • 有没有办法在非洲没有单引号的情况下做到这一点?
    • 也许可以试试这个result = filter(None, re.split("[\s_']+", x))
    【解决方案3】:

    [^a-zA-Z0-9]+ 模式将提供的字符串拆分为任何字符或非数字或 ASCII 字母的字符序列。

    示例字符串中的最后一个字符与拆分模式匹配。 re.split 将匹配之前的子字符串和 after 添加到其输出中(直到下一个匹配或字符串结尾)。在这种情况下,after 子字符串是空字符串,因此是报告的输出。

    其他答案提供了解决方法来获得您想要的行为,因此我不会在此答案中重复它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2014-06-07
      相关资源
      最近更新 更多