数据Nitro和正则表达式(Python)

时间:2014-05-15 18:54:22

标签: python regex excel datanitro

我在MS Excel 2010中有这个专栏 - 它包含'邮政编码'和'电子邮件ID'的组合

我正在尝试从此列中提取这些 zip-codes (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的re模块。

import re


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

我在该列上运行了正则表达式,我得到了这个结果:

[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']

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

3 个答案:

答案 0 :(得分:6)

为什么你不能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']

答案 1 :(得分:2)

以下正则表达式将匹配每个字符串并将邮政编码提取为组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)

答案 2 :(得分:1)

只是另外一个注释,在DataNitro上回答特定于您的原始问题。

已经完成了大量的DataNitro loopinfg,并且整个列中最有效的阅读方式是:

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

与@ cyber的解决方案相结合,两个班轮将为您提供答案:

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

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

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