【问题标题】:Define string between comma x and comma y the split all bytes using a comma在逗号 x 和逗号之间定义字符串,使用逗号分割所有字节
【发布时间】:2014-08-25 00:18:54
【问题描述】:

我有一些我正在解析的数据采用以下格式:

8344,5354,Binh Duong,1,0103313333333033133331,1,13333333331,1,00313330133
,8344,7633,TT Ha Noi,2,3330333113333303111303,3,33133331133,2,30333133010
....more data.....

第一条记录不以逗号开头,但所有后续数据行都以逗号开头。我想取第一行第 4 和第 5 个逗号之间的所有数字,以及所有其他行的第 5 和第 6 个逗号之间的所有数字,并使用逗号分割这个字符串。

所以在上面的例子中 '0103313333333033133331' 应该打印为 '0,1,0,3,3,1,3,3,3,3,3,3,3,0,3,3,1,3 ,3,3,3,1'。困难在于逗号 x 和 y 之间的字符串长度取决于我正在解析的数据。我已经使用正则表达式来隔离有问题的字符串,只要它有 16 位数字,但在我可能解析的所有项目中并非如此。

因此,使用具有 16 个“{}”实例的 .format() 方法会在字符串不是 16 字节长的项目上引发元组索引错误。

谁能建议一种实现我想要的方法?

谢谢

【问题讨论】:

  • 你需要得到的每行总是22位数字?
  • @alecxe 嗨,alecxe,根据我正在解析的内容,数字可能会有很大差异。
  • 好的,所以,这是一个逗号分隔的数据,您可以通过csv 模块解析。问题是:你知道这组数字会出现在什么位置吗? (例如,总是在第 4 和第 5 个逗号之间)
  • @alecxe 是的,它总是在第一行数据的第 4 和第 5 个逗号之间,并且总是在所有后续行的第 5 和第 6 个逗号之间
  • 您真的要为此使用正则表达式吗?

标签: python regex


【解决方案1】:

我会使用str.split() 获取正确的字段,并使用str.join() 将其拆分为单个字符:

with open('xx.in') as input_file:
   for line in input_file:
       line = line.strip().strip(',')
       line = line.split(',')
       field = line[4]
       print ','.join(field)

【讨论】:

    【解决方案2】:

    一种稍微不同的方法,正则表达式从末尾抓取逗号分隔行的第 5 个元素:

    >>> import re
    >>> lines = ['8344,5354,Binh Duong,1,0103313333333033133331,1,13333333331,1,00313330133',',8344,7633,TT Ha Noi,2,3330333113333303111303,3,33133331133,2,30333133010']
    >>> for line in lines:
    ...     num = re.search(r'\d+(?=(?:,[^,]+){4}$)', line).group()
    ...     seq = ','.join(list(num))
    ...     print(seq)
    ...
    0,1,0,3,3,1,3,3,3,3,3,3,3,0,3,3,1,3,3,3,3,1
    3,3,3,0,3,3,3,1,1,3,3,3,3,3,0,3,1,1,1,3,0,3
    

    【讨论】:

      【解决方案3】:

      你可以使用这个正则表达式:

      ^,?\d+,\d+,[\w\s]+,\d+,(\d+)
      

      Working demo

      MATCH 1
      1.  [23-45] `0103313333333033133331`
      MATCH 2
      1.  [97-119]    `3330333113333303111303`
      

      然后你可以用\d分割每个组的内容

      p = re.compile(ur'(\d)')
      test_str = u"0103313333333033133331"
      subst = u"\1,"
      
      result = re.sub(p, subst, test_str)
      
      >> 0,1,0,3,3,1,3,3,3,3,3,3,3,0,3,3,1,3,3,3,3,1,
      

      【讨论】:

      • 我正在努力让它工作,但这里已经很晚了。明天我会试试你的解决方案,让你知道我是否让它工作。谢谢。
      猜你喜欢
      • 2020-08-30
      • 2012-10-31
      • 2014-12-19
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2018-05-20
      • 2017-04-07
      • 1970-01-01
      相关资源
      最近更新 更多