【问题标题】:Data Nitro and regular expression (Python)数据 Nitro 和正则表达式 (Python)
【发布时间】:2014-05-15 18:54:21
【问题描述】:

我在 MS Excel 2010 中有这个专栏 - 它结合了“邮政编码”和“电子邮件 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 的 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']

如何将结果提取成人类可读的邮政编码形式?

【问题讨论】:

  • 你的正则表达式实验的结果是什么?为什么不只是.split()[0]
  • [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']

标签: python regex excel datanitro


【解决方案1】:

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

【讨论】:

  • 其实我这里处理的是400行,手动在特定列表项周围添加逗号和引号是不可行的,我说的是你的list l
  • 可以以str(Cell(i).value)为例,将其转为字符串。
【解决方案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)

【讨论】:

    【解决方案3】:

    只是针对您在 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 的答案就变成了:

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

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多