web-dev-qa-db-ja.com

ファイル内のタブに基づいて文字列を分割する

タブ(「\ t」)で区切られた値を含むファイルがあります。リストを作成し、ファイルのすべての値をリストに保存しようとしています。しかし、問題が発生します。これが私のコードです。

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

各値の間にタブが1つしかない限り、問題なく機能します。ただし、タブが複数ある場合は、タブも値にコピーされます。私の場合、主に余分なタブはファイルの最後の値の後になります。

38
hjelpmig

ここで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']
62

正規表現を使用してこれを行うことができます。

import re
patt = re.compile("[^\t]+")


s = "a\t\tbcde\t\tef"
patt.findall(s)
['a', 'bcde', 'ef']  
4
DimmuR

タブで分割しますが、空白の一致をすべて削除します。

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']
1
CornSmith

他のregexベースのソリューション:

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

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

Pythonは、同名の csv モジュールでCSVファイルをサポートしています。 カンマで区切られた値よりもはるかに多くをサポートしているため、比較的誤った名前です。

基本的なWord分割を超える必要がある場合は、ご覧ください。たとえば、引用符で囲まれた値を処理する必要があるためです。

0
Sylvain Leroux