首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用regex提取数据并写入CSV、Python glob (熊猫?)

用regex提取数据并写入CSV、Python glob (熊猫?)
EN

Stack Overflow用户
提问于 2014-02-03 22:14:55
回答 1查看 1.3K关注 0票数 0

我有一大串肮脏的CSV,里面有各种格式的电话号码。我想要的是梳理他们的所有,并导出到一个单一列CSV清洁电话号码,以一种简单的格式。到目前为止,我已经拼凑了一些有用的东西,尽管它有一些问题:(下面的部分修改)

代码语言:javascript
复制
import csv
import re
import glob
import string

with open('phonelist.csv', 'wb') as out:
    seen = set()
    output = []
    out_writer = csv.writer(out)
    csv_files = glob.glob('CSVs\*.csv')
    for filename in csv_files:
        with open(filename, 'rbU') as ifile:
            read = csv.reader(ifile)
            for row in read:
                for column in row:
                    s1 = column.strip()
                    if re.match(r'\b\d\d\d\d\d\d\d\d\d\d\b', s1):
                        if s1 not in seen:
                            seen.add(s1)
                            output.append(s1)
                    elif re.search(r'\b\(\d\d\d\) \d\d\d-\d\d\d\d\b', s1):
                        s2 = filter(lambda x: x in string.digits, s1)
                        if s2 not in seen:
                            seen.add(s2)
                            output.append(s2)
    for val in output:
        out_writer.writerow([val])

我把这些放在一起,没有任何正式的python知识,只是拼凑我在这个网站上收集到的东西。任何关于丙酮化或利用熊猫图书馆作为捷径的建议都是受欢迎的。

第一个问题:筛选到匹配值的最简单方法是什么?呃,我可能会得到9815556667 John Smith,但我只想要号码。

第二期:这需要很长时间。我猜这是兰巴的一部分。有没有更快或更有效的方法?

第三个问题:我如何在程序目录和CSVs目录(如所写的那样)中显示*.csv?

我知道这一次有好几个问题,但我已经问到一半了。任何额外的指针都将不胜感激。

例如,请求,这不是来自一个文件(这些是多千兆字节文件),但是下面是我要寻找的:

代码语言:javascript
复制
John Smith, (981) 991-0987, 9987765543 extension 541, 671 Maple St 98402
(998) 222-0011, 13949811123, Foo baR Us, 2567 Appleberry Lane
office, www.somewebpage.com, City Group, Anchorage AK
9281239812
(345) 666-7777

应成为:

代码语言:javascript
复制
9819910987
9987765543
9982220011
3949811123
3456667777

(我忘记了,我也需要从11位数中去掉一个领先1)

编辑:我已经修改了我的当前代码,以纳入Shahram的建议,因此,现在,从上面的for column in row,我得到了,而不是上面的:

代码语言:javascript
复制
for column in row:
    s1 = column.strip()
    result = re.match(
        r'.*(\+?[2-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)? ?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1) or re.match(
        r'.*(\+?[2-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)?-?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1)
    if result:
        tempStr = result.group(1)
        for ch in ['(', ')', '-', ' ']:
            tempStr = tempStr.replace(ch, '')
        if tempStr not in seen:
            seen.add(tempStr)
            output.append(tempStr)

这似乎符合我的目的,但我仍然不知道如何浏览当前的目录和子目录,我仍然不知道我的代码是否有问题,因为我的hodge-podge-ing是我不知道的。而且,在我更大的目录中,这需要花费很长时间--就像在20分钟左右,大约有一组CSV在为我计时(用我的手)。我不知道它是否遇到了麻烦,但从蟒蛇通常咬穿任何数量的CSV的速度来判断,我感觉好像错过了什么东西。

EN

回答 1

Stack Overflow用户

发布于 2014-02-03 23:02:23

关于第一个问题,您可以使用下面的正则表达式来捕获不同类型的电话号码:

代码语言:javascript
复制
  result = re.match(r'.*(\+?[0-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)?-?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1)
  if result:
    if result.group(1) not in seen:
       seen.add(result.group(1))
       output.append(result.group(1))

关于你的第二个问题:你可能想看看替换函数。因此,上面的代码可以更改为:

代码语言:javascript
复制
  result = re.match(r'.*(\+?[0-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)?-?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1)
  if result:
    if result.group(1) not in seen:
       tempStr = result.group(1)
       tempStr.replace('-','')
       seen.add(tempStr)
       output.append(tempStr)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21538978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档