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

好的,这是另一种方式。这是基于您的特定用例的“拆分”,不涉及正则表达式。关键思想是第二列(名称)可以在其中包含空格,而所有其他列都具有明确定义的格式。所以想法是从左右分开,保持其余部分(名称列)不变:

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 回答
2

要匹配的可能合适的正则表达式是:

^(\d+) (.+) (\d+(\.\d+)?|-) (\d+(\.\d+)?|-)$

示例用法:

>>> re.match(r'(\d+) (.+) (\d+(\.\d+)?|-) (\d+(\.\d+)?|-)$', '3 Name Test 50.5 -').groups()
('3', 'Name Test', '50.5', '-')
于 2013-10-11T05:02:50.637 回答
1

尝试这个:^(\d+) (.+) (\d+\.\d+|-|\d+) (\d+\.\d+|-|\d+)$

这应该与您的所有示例字符串匹配。

一切顺利

于 2013-10-11T23:47:42.833 回答