【问题标题】:Grabbing CSV Information with Regex in Python在 Python 中使用正则表达式获取 CSV 信息
【发布时间】:2017-01-10 16:12:30
【问题描述】:

我正在尝试从 CSV 文档中提取所有电话号码,并将它们附加到字符串格式的列表中。这是我的输入示例:

someone@somewhere.com,John,Doe,,,(555) 555-5555

这是我正在使用的代码:

l = []
with open('sample.csv', 'r') as f:
    reader = csv.reader(f)
    for x in reader:
        number = re.search(r'.*?@.*?,.*?,.*?,.*?,.*?,(.*?),',x)
        if number in x:
            l.append(''.join(number))

基本上,我正在尝试检查行中的某个位置(括号所在的位置)是否有一个数字,然后使用连接将其作为字符串附加到列表中。但是,我不断收到此错误:

Traceback (most recent call last):
  File "C:/Users/svillamil/Desktop/Final Phone.py", line 14, in <module>
    number = re.search(b'.*?@.*?,.*?,.*?,.*?,.*?,(.*?),', x)
  File "C:\Users\svillamil\AppData\Local\Programs\Python\Python36-32\lib\re.py", line 182, in search
    return _compile(pattern, flags).search(string)
TypeError: expected string or bytes-like object

我该如何解决这个问题?

【问题讨论】:

  • 强制使用正则表达式?
  • 您使用了错误的工具来完成这项工作。此外,x 不是字符串。查看csv 库的文档。
  • 为什么不直接用逗号分割文件行并遍历元素检查每个是否匹配(???)?

标签: python regex python-3.x csv


【解决方案1】:

遍历csv.reader 会为您提供每行的字符串列表。

获取索引 5 处的值已经为您提供了电话号码(如果我计算正确的话)。您不需要正则表达式来执行此操作。

l = []
with open('sample.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        number = row[5]
        if number:
            l.append(number)

(相反,如果您坚持使用正则表达式,则不需要csv 进行拆分,只需遍历文件的原始行即可。)

【讨论】:

  • 这行得通。谢谢你。我非常专注于使用正则表达式,我什至没有想到使用索引号。
【解决方案2】:

假设电话号码可以出现在文件行中的任何分隔位置,您应该只用逗号分隔文件行并遍历元素检查每个元素是否匹配 (...):

import re

result = []

with open('sandbox.txt', 'r') as f:
    fileLines = f.readlines()

for fileLine in fileLines:
    fileLine = fileLine.strip()
    lineElems = fileLine.split(',')

    for lineElem in lineElems:

        pattern = re.compile("\(...\)")

        if pattern.match(lineElem):
            print("Adding %s" % lineElem)
            result.append(lineElem)

【讨论】:

  • “用逗号分割文件行”——这正是 csv 模块的用途。
  • 我试图为 "(b'.*?@.*?,.*?,.*?,.*?,.*?,(.*? ),', x)",丑陋而混乱
【解决方案3】:

x 是一个包含行的每个字段的列表。

所以一种方法是加入数组,然后应用正则表达式,

foo=','.join(x)
number = re.search(r'.*?@.*?,.*?,.*?,.*?,.*?,(.*?),', foo)

或者您可以遍历行中的每个字段并检查其是否为数字

for row in reader:
   for field in row:
       number = re.search(r'<phone-number-regex>', field)
       if number in x:
           l.append(''.join(number))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多