在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?
答案 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),为我工作。即便如此,它有点难看......