【问题标题】:Python Regex to Split a line into 4 partsPython正则表达式将一行分成4部分
【发布时间】:2013-10-19 02:01:56
【问题描述】:

如何使用正则表达式将每一行拆分为以下内容

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+)')

| 符号所在的位置就是需要拆分的位置...

【问题讨论】:

  • 这是匹配,不是拆分(拆分为re.split)。
  • 您的Name Test 部分可以包含数字吗?像 - Name - Test 23 Test?
  • Name Test 部分可以包含数字是的,可以是 Test22TestTest 22 TestTest 22-TestTest-22-Test 所有版本

标签: python regex python-2.7


【解决方案1】:

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

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

当我在 IPython 中运行以下 sn-p 并在 /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 |姓名测试 | - | -

【讨论】:

  • 我想到了这种方法(并且倾向于使用它),但我懒得去做。然而,我认为他正试图从中得到一个元组。 | 分离只是表示分裂点。
【解决方案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', '-')

【讨论】:

  • 我试过了:re.compile('(\d+) (.+) (.+) (.+) 这有什么缺点?
  • @Hyflex:如果您对此不确定,您可能还没有准备好使用正则表达式。我建议您阅读有关它们的信息;它真的会得到回报。
  • 我读过它们只是没有 100% 理解它们,我还在学习。
【解决方案3】:

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

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

一切顺利

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多