【问题标题】:splitting a string based on tab in the file根据文件中的选项卡拆分字符串
【发布时间】:2013-06-06 23:13:00
【问题描述】:

我的文件包含由制表符 ("\t") 分隔的值。我正在尝试创建一个列表并将文件的所有值存储在列表中。但我遇到了一些问题。这是我的代码。

line = "abc def ghi"
values = line.split("\t")

只要每个值之间只有一个制表符,它就可以正常工作。但是,如果有一对一的选项卡,那么它也会将该选项卡复制到值。在我的情况下,额外的选项卡通常位于文件中的最后一个值之后。

【问题讨论】:

  • 您的值中是否还有其他空格字符应该被拆分?因为如果不是,您可以只使用line.split(),它会处理这个问题(以及丢弃空的前导/尾随元素)。

标签: python string split


【解决方案1】:

另一个基于regex 的解决方案:

>>> strs = "foo\tbar\t\tspam"

>>> r = re.compile(r'([^\t]*)\t*')
>>> r.findall(strs)[:-1]
['foo', 'bar', 'spam']

【讨论】:

    【解决方案2】:

    您可以在这里使用regex

    >>> import re
    >>> strs = "foo\tbar\t\tspam"
    >>> re.split(r'\t+', strs)
    ['foo', 'bar', 'spam']
    

    更新:

    您可以使用str.rstrip 去掉尾随的'\t',然后应用正则表达式。

    >>> yas = "yas\t\tbs\tcda\t\t"
    >>> re.split(r'\t+', yas.rstrip('\t'))
    ['yas', 'bs', 'cda']
    

    【讨论】:

    • 比我的过滤方法更好+1
    • 但是如果我们在文件末尾有标签,它将如何处理。它仍然会取空值。
    • @yasra002 请发一个例子。
    • @AshwiniChaudhary yas = "yas bs cda " bbb = re.split(r'\t+', yas) 所以 bb 仍然会有空值,因为最后有一个选项卡。跨度>
    • @AshwiniChaudhary 非常感谢 :)
    【解决方案3】:

    Python 在同名的 csv 模块中支持 CSV 文件。它的名称相对错误,因为它支持的不仅仅是 逗号 分隔值。

    如果您需要超越基本的分词,您应该看看。比如说,因为您需要处理引用的值...

    【讨论】:

    • 是的,但这仍然会导致空元素。
    【解决方案4】:

    在标签上拆分,然后删除所有空白匹配项。

    text = "hi\tthere\t\t\tmy main man"
    print [splits for splits in text.split("\t") if splits is not ""]
    

    输出:

    ['hi', 'there', 'my main man']
    

    【讨论】:

      【解决方案5】:

      您可以使用正则表达式来做到这一点:

      import re
      patt = re.compile("[^\t]+")
      
      
      s = "a\t\tbcde\t\tef"
      patt.findall(s)
      ['a', 'bcde', 'ef']  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多