正则表达式或其他方式从具有变量条目的行获取数据

时间:2014-04-22 13:24:41

标签: python regex string split

在python中,我试图从一行中获取数据。 这些行看起来像:

 1.  cpasite=5 nsubl=4 cpatypes=3,4,5,6
 2.  cpasite=6 nsubl=2 cpatypes=7,8
 3.  cpasite=7 nsubl=4 cpatypes=9,10
 4.  cpasite=8 nsubl=2 cpatypes=11,12
 5.  cpasite=9 nsubl=6 cpatypes=13,14,15,16,17,18

我把它正则表示为:

pattern=r'(\d+)\. \s* cpasite=(.*)\s* nsubl=(.*)\s* cpatypes=(.*)'

问题是,我需要这些网站(例如3,4,5,6),以便我可以将它们用于我的目的。但鉴于数字不固定,我不能分裂(据我所知)。

我如何使用这些cpasites?

3 个答案:

答案 0 :(得分:5)

为什么不使用你的regex,然后选择第4个被捕获的组: '3,4,5,6'

然后,您可以在,上拆分该字符串,以获取可以单独使用的值列表:

s = '3,4,5,6'
s = map(int, s.split(','))

print s
[3,4,5,6]

>>> print s[2]
5

答案 1 :(得分:1)

斯普利特是你的朋友。减少正则表达式==减少复杂性。

s = '1.  cpasite=5 nsubl=4 cpatypes=3,4,5,6'
sites = s.split('=')[-1]
sites = sites.split(',')

答案 2 :(得分:0)

应该是:

 pattern=r'(\d+)\. \s* cpasite=(.*)\s* nsubl=(.*)\s* cpatypes=(\d+)(?:,(\d+))*'

然而由于某种原因,似乎

(\d+)(?:,(\d+))*

仅捕获第一个cpatypes和最后一个cpatype ... 似乎是我的re模块的错误

转动周围:

但是,如果您知道可以拥有的最大cpatype数量,那么

pattern=r'(\d+)\. \s* cpasite=(.*)\s* nsubl=(.*)\s* cpatypes=(\d+)(?:,(\d+))?(?:,(\d+))?'

重复

(?:,(\d+))?

根据需要多次(最大预期的cpatypes),为我工作。即便如此,它有点难看......