Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定义逗号x和逗号y之间的字符串使用逗号拆分所有字节_Python_Regex - Fatal编程技术网

Python 定义逗号x和逗号y之间的字符串使用逗号拆分所有字节

Python 定义逗号x和逗号y之间的字符串使用逗号拆分所有字节,python,regex,Python,Regex,我正在解析一些数据,其格式如下: 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个逗号之

我正在解析一些数据,其格式如下:

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个逗号之间的所有数字,并使用逗号拆分此字符串

因此,在上述示例中,“01033133333033133331”应打印为“0,1,0,3,3,1,3,3,3,3,3,3,3,3,3,1,3,3,3,3,1”。难点在于逗号x和y之间的字符串长度根据我正在解析的数据而变化。我已经使用正则表达式来隔离有问题的字符串,前提是它有16位数字,但是我可能要分析的所有项目都不是这样

因此,使用带有16个“{}”实例的.format()方法时,在字符串长度不到16字节的项上抛出了一个元组索引错误

有人能提出一个方法来实现我想要的吗


谢谢

我将使用
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)

我将使用
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)

您可以使用此正则表达式:

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

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,

您可以使用此正则表达式:

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

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,

一种稍有不同的方法是使用正则表达式,从末尾抓取逗号分隔行的第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

一种稍有不同的方法是使用正则表达式,从末尾抓取逗号分隔行的第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

您需要获取的每一行上总是有22位数字?@alecxe嗨,alecxe,没有。根据我正在解析的内容,数字可能会有很大的变化。好的,这是一个逗号分隔的数据,您可以通过
csv
模块解析。问题是:你知道这组数字会出现在什么位置吗?(例如,始终在第4和第5个逗号之间)@alecxe是的,它将始终在第一行数据的第4和第5个逗号之间,并且在所有后续行数据的第5和第6个逗号之间。您真的想使用正则表达式吗?您需要获得的每行数据总是22位数字?@alecxe hi alecxe,不,根据我正在解析的内容,数字可能会有很大差异。好的,这是一个逗号分隔的数据,您可以通过
csv
模块解析。问题是:你知道这组数字会出现在什么位置吗?(例如,始终在第4和第5个逗号之间)@alecxe是的,在第一行数据上始终在第4和第5个逗号之间,在所有后续行上始终在第5和第6个逗号之间。你真的想用正则表达式来实现这一点吗?我正在努力使这一点起作用,但现在已经很晚了。明天我会试试你的解决方案,让你知道我是否能让它发挥作用。谢谢。我有点费劲想让它发挥作用,但现在已经很晚了。明天我会试试你的解决方案,让你知道我是否能让它发挥作用。谢谢