我有一些我正在解析的数据,它采用以下格式:
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字节长的项目上抛出了一个元组索引错误。
有人能建议一种实现我想要的方法吗?
由于
答案 0 :(得分:2)
我会使用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)
答案 1 :(得分:1)
您可以使用此正则表达式:
^,?\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,
答案 2 :(得分:1)
与正则表达式略有不同的方法,它从末尾抓取逗号分隔行的第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