2

正規表現を使用して各行を次のように分割するにはどうすればよいですか

3 Name Test 50.5 -
2 Name-Test - 3.12
1 Name Test Test 50.5 -
2 Name Test 32 213.12
3 Name Test 50.5 -
2 Name Test - 50.12
1 Name Test 50.5 -
2 Name Test - -

次のように分割されます。

3 | Name Test | 50.5 | -
2 | Name-Test | - | 3.12
1 | Name Test Test | 50.5 | -
2 | Name Test | 32 | 213.12
3 | Name Test | 50.5 | -
2 | Name Test | - | 50.12
1 | Name Test | 50.5 | -
2 | Name Test | - | -

私が得た最も遠いものは次のとおりです。re.compile('(\d+) (.+) (\w+.\w+)')

シンボル|がある場所は、分割が必要な場所です...

4

3 に答える 3

3

わかりました、ここに別の方法があります。これは、特定のユース ケースの「分割」に基づいており、正規表現は含まれません。重要なアイデアは、2 番目の列 (名前) にスペースを含めることができ、他のすべての列には明確に定義された形式があるということです。したがって、アイデアは、残り (名前列) をそのままにして、左右から分割することです。

def mysplit(line):
    r = line.rsplit(' ', 2)
    l = r[0].split(' ', 1)
    print " | ".join(l + r[i:])

IPython で入力を使用して次のスニペットを実行すると/tmp/lines.txt:

for l in open('/tmp/lines.txt'):
    mysplit(l.strip())

結果:

3 | 名前テスト | 50.5 | -
2 | 名前テスト | - | 3.12
1 | 名前 テスト テスト | 50.5 | -
2 | 名前テスト | 32 | 213.12
3 | 名前テスト | 50.5 | -
2 | 名前テスト | - | 50.12
1 | 名前テスト | 50.5 | -
2 | 名前テスト | - | -
于 2013-10-11T05:34:39.863 に答える
1

これを試して:^(\d+) (.+) (\d+\.\d+|-|\d+) (\d+\.\d+|-|\d+)$

これは、すべてのサンプル文字列と一致する必要があります。

さようなら

于 2013-10-11T23:47:42.833 に答える