首页 文章

Python regexp将数字与空格匹配

提问于
浏览
2

我是regexp新手,我需要一些帮助 . 我有代表表格的文字 . 我知道它将由7列组成:

| int | int mixed with -. | unicode string with everything | float | float | int | float |

问题是浮点数是用千位之间的空格表示的(1234,43 => 1 234,43) . 此外,字符串可以包含空格并以数字结尾 . 我试过这样的事情(对于新行char的每一行条纹):

regex = re.compile(r"(\d+) ([\d.-]+) (.*) ([\d+ ]?\d+,\d+) ([\d+ ]?\d+,\d+) (\d+) ([\d+ ]?\d+,\d+)$", re.UNICODE)
w = regex.findall(line)

不幸的是,它并不适用于所有情况 . 一些测试数据:

49 602 DSKOD SMCX 262,59 1 131,30 1 1 131,30
49 602 DSKOD SMCX 3 5 262,59 1 131,30 1 1 131,30
50 61-201 łóćźż 1 2 669,50 334,75 1 334,75
51 1-214 AÓŻĆÓDS" 70,35 350,18 3 105,53

成千上万的案件有问题,因为我得到:

[]
[]
[(u'50', u'61-201', u'\u0142\xf3\u0107\u017a\u017c 1 2', u'669,50', u'334,75', u'1', u'334,75')]
[(u'51', u'1-214', u'A\xd3\u017b\u0106\xd3DS"', u'70,35', u'350,18', u'3', u'105,53')]

在第三个例子中,我希望字符串末尾的 2 位于下一列 . 你知道在Python 2.7上有一些线索如何正确匹配吗?我稍后会和这个unicode战斗 .

2 回答

  • 1

    问题是 [\d+ ]? . 这匹配零或一个数字,加上空格 . OTHER问题是在列分隔符和字段内使用空格而没有某种引用,但这适用于您的数据 . 我还更改了第二列,它有一个额外的 . 和第三列只能抓取非空格字符:

    #!python3
    # coding: utf-8
    import re
    
    data = '''\
    49 602 DSKOD SMCX 262,59 1 131,30 1 1 131,30
    49 602 DSKOD SMCX 3 5 262,59 1 131,30 1 1 131,30
    50 61-201 łóćźż 1 2 669,50 334,75 1 334,75
    50 61-201 łóćźż 1 669,50 334,75 1 334,75
    51 1-214 AÓŻĆÓDS" 70,35 350,18 3 105,53
    '''.splitlines()
    
    regex = re.compile(r"(\d+) ([\d-]+) (.*?) ((?:\d{1,3})?(?:\ \d{3})*,\d{2}) ((?:\d{1,3})?(?:\ \d{3})*,\d{2}) (\d+) ((?:\d{1,3})?(?:\ \d{3})*,\d{2})", re.UNICODE)
    for line in data:
        print(regex.match(line).groups())
    

    输出:

    ('49', '602', 'DSKOD SMCX', '262,59', '1 131,30', '1', '1 131,30')
    ('49', '602', 'DSKOD SMCX 3', '5 262,59', '1 131,30', '1', '1 131,30')
    ('50', '61-201', 'łóćźż 1', '2 669,50', '334,75', '1', '334,75')
    ('50', '61-201', 'łóćźż', '1 669,50', '334,75', '1', '334,75')
    ('51', '1-214', 'AÓŻĆÓDS"', '70,35', '350,18', '3', '105,53')
    
  • 2

    我会打破这个:

    r = re.compile(r"(\d+) 
                     ([\d.-]+) 
                     ([^ ]*) 
                     ((\d+ ?)+,\d+) 
                     ((\d+ ?)+,\d+) 
                     (\d+) 
                     ((\d+ ?)+,\d+)$", re.UNICODE)
    

    更改是在unicode部分,不要太贪婪和避免空格,然后在浮动部分 . 它会有浮动没有逗号的问题 .

    在你的第一行:

    In [21]: r.findall(l)
    Out[21]: 
    [('49',
      '602',
      'DSKODSMCX',
      '2 262,59',
      '262',
      '1 131,30',
      '131', #!
      '1',
      '1 131,30',
      '131')] #!
    

    标有#的行!是我用来重复“\ d \ d \ d”模式的嵌套组产生的额外捕获 .

    另一个样本:

    In [23]: l2 = '49 602-1 DKSAJ 231 442 123,2 1 123 123,4 1 1 533 123,2'
    
    In [24]: r.findall(l2)
    Out[24]: 
    [('49',
      '602-1',
      'DKSAJ',
      '231 442 123,2',
      '123',
      '1 123 123,4',
      '123',
      '1',
      '1 533 123,2',
      '123')]
    

相关问题