数据硝基和正则expression式(Python)

我在MS Excel 2010中有这个专栏,里面有'邮政编码'和'email-id'

我试图从这一栏中提取这些邮政编码 (20530,90012-3308等)。

20530 mark@ucvxcx.gov 20530 kidafd@gmail.com 20530 vladfeodsaf@usdodfaadj.govv 20530 syadfadsbil.vvbvx@vnvnvn.gov 20004 safdbnvis9dfg@infdda.gov 20530 vhlhsdlf8dlfha@vbvbcxbUI.GOV 90012-3308 h.james@asdfad.gov 90012-3308 madsfl.hjlkdjd@pkdoi.gov 90012 mark.fraser@ruskgb.zx 

我尝试了Python的重新模块。

 import re for i in range(1, 9): Cell(i, 4).value = re.findall(r'\d+', Cell(i, 1).value) #storing result in column4 

我跑在这个列的正则expression式,我得到了这个结果:

 [u'20530'] [u'20530'] [u'20530'] [u'20530'] [u'20004', u'9'] [u'20530', u'8'] [u'90012', u'3308'] [u'90012', u'3308'] [u'90012'] 

如何将结果提取到人类可读的邮政编码表格中?

以下正则expression式将匹配每个string并将邮政编码提取为组1:

 ([\d\-]+)\s+[\w@\.]+ 

下面是Python代码一次提取所有的邮政编码:

 import re text = r''' 20530 mark@ucvxcx.gov 20530 kidafd@gmail.com 20530 vladfeodsaf@usdodfaadj.govv 20530 syadfadsbil.vvbvx@vnvnvn.gov 20004 safdbnvis9dfg@infdda.gov 20530 vhlhsdlf8dlfha@vbvbcxbUI.GOV 90012-3308 h.james@asdfad.gov 90012-3308 madsfl.hjlkdjd@pkdoi.gov 90012 mark.fraser@ruskgb.zx''' re.compile(r'([\d\-]+)\s+[\w@\.]+').findall(text) 

为什么你不能split

 >>> '20530 mark@ucvxcx.gov'.split() ['20530', 'mark@ucvxcx.gov'] 

然后抓住第一个元素。

 >>> '20530 mark@ucvxcx.gov'.split()[0] '20530' 

对于你所有的数据:

 l = ['20530 mark@ucvxcx.gov', '20530 kidafd@gmail.com', '20530 vladfeodsaf@usdodfaadj.gov', '20530 syadfadsbil.vvbvx@vnvnvn.gov', '20004 safdbnvis9dfg@infdda.gov', '20530 vhlhsdlf8dlfha@vbvbcxbUI.GOV', '90012-3308 h.james@asdfad.gov', '90012-3308 madsfl.hjlkdjd@pkdoi.gov', '90012 mark.fraser@ruskgb.zx'] [entry.split()[0] for entry in l] 

结果

 ['20530', '20530', '20530', '20530', '20004', '20530', '90012-3308', '90012-3308', '90012'] 

只是在DataNitro上针对您的原始问题做出附加注释。

像这样做了很多的DataNitro loopinfg,整个列中最有效的阅读方式是:

 l = Cell("A1").vertical # returns a list of all values starting in A1 going down to 1st blank cell 

结合@ cyber的解决scheme两class轮将给你你的答案:

 l = Cell("A1").vertical [entry.split()[0] for entry in l] 

或者如果你喜欢正则expression式的灵活性Johnathan Benn回答becomomes:

 l = Cell("A1").vertical [re.compile(r'([\d\-]+)\s+[\w@\.]+').findall(entry) for entry in l]