【问题标题】:Python regex findall to read line in .csv filePython regex findall 读取 .csv 文件中的行
【发布时间】:2016-08-04 20:48:57
【问题描述】:

我有一个 .csv 文件(或者很可能是一个 .txt 文件),其中包含一些记录:

JB74XYZ Kerry   Katona  44  Mansion_House   LV10YFB
WL67IAM William Iam 34  The_Voice_Street    LN44HJU

等等等等

我已经使用 python 打开并读取文件,然后正则表达式 findall(并尝试了类似的正则表达式规则)来识别匹配项:

import re
from re import findall

reg = "JB74XYZ"

with open("RegDD.txt","r")as file:
    data=file.read()
    search=findall(reg,data)

print (search)

给出结果输出:

['JB74XYZ']

我已经对此进行了测试,看来我的正则表达式 findall 可以正常工作,因为它可以正确识别“匹配”并返回它。

  1. 我的问题是,如何同时返回“匹配”行的剩余内容? (最终我会将其写入一个新文件,但现在我只想打印匹配的行)。

我已经探索了将 python 字典作为索引事物的一种方式,但我碰壁了,只得到了正则表达式返回一个肯定的结果。

  1. 我想,第二个问题可能是:我是否完全选择了错误的方法?

我希望我已经足够具体,这是第一个问题,我已经花了几个小时(而不是几分钟)寻找具体的解决方案,并尝试了一些想法。 我猜这不是一个特别棘手的概念,但如果可能的话,我可以做一些提示。

【问题讨论】:

  • 你的目标是什么?你想索引什么?
  • 我的目标是存储具有相关名称和地址的车牌详细信息。车牌将在系统的另一部分识别,然后我希望将其他相关的详细信息写入另一个文件。广义的想法是可以自动识别汽车,并生成车主详细信息。 (不过都是假设性的,我不是在窥探等。

标签: python regex csv findall


【解决方案1】:

处理此问题的更好方法是使用 Python 的 csv 模块。从您的 CSV 的外观来看,我猜它是制表符分隔的,所以我正在摆脱这个假设。

import csv

match = "JB74XYZ"

matched_row = None
with open("RegDD.txt", "r") as file:
    # Read file as a CSV delimited by tabs.
    reader = csv.reader(file, delimiter='\t')
    for row in reader:
        # Check the first (0-th) column.
        if row[0] == match:
            # Found the row we were looking for.
            matched_row = row
            break

print(matched_row)

这应该会从matched_row 输出以下内容:

['JB74XYZ', 'Kerry', 'Katona', '44', 'Mansion_House', 'LV10YFB']

【讨论】:

【解决方案2】:

我会使用csv module,用制表符作为分隔符读入文件,然后逐行比较。如果该行中有匹配项,请将其附加到结果列表中。

【讨论】:

    【解决方案3】:

    如果您想读取 .csv 文件中的所有值并将它们保存在字典中,键为 JB74XYZ 以及与此相关的详细信息。然后您可以逐行读取此文件,然后使用split(" ") 获取列表。然后,您只需从列表中删除第一个元素并将其设为键并将剩余列表保存为字典的值,即可轻松制作字典。 如果你想使用正则表达式,你应该参考这个链接: https://docs.python.org/3/library/re.html 用于从文件中提取详细信息并将其保存在元组中。

    【讨论】:

    • 分隔符似乎是制表符,而不是空格。
    • 这取决于我想@Suzana_K的输入类型
    • 谢谢大家。非常有用。
    【解决方案4】:

    因此,在查看了所有出色的回复之后,我最终集中精力(正如这里的一些人建议的那样)更详细地查看 csv 模块。经过一番挖掘,我最终得到了这个(而且,在这个阶段,我不确定我是如何做到的......):

    import csv
    
    reg="TS74UIO"
    reader = csv.reader(open('T3.csv'))
    row=0
    for row in reader:
    if row[0] == reg:
        print (row)
    else:
        row=+1
    

    这导致了我认为我可以写入另一个文件的输出:

    ['TS74UIO', 'Kerry', 'Katona', '44', 'Mansion_House', 'LV10YFB']
    

    【讨论】:

      【解决方案5】:

      你可以试试re.search,或者如果你需要它在开头,re.match。两者都返回一个MatchObject,其中包含有关操作的信息,包括对原始字符串的访问。例如,要获取剩余的字符串:

      重新导入

      reg = "(JB74XYZ)"
      
      with open("RegDD.txt","r")as file:
          for line in file:
              line = line.strip()
              match = re.match(reg,line.strip())
              if match:
                  print (line[match.end():])
      

      请注意,我必须将正则表达式更改为一个组,以便告诉 re 我想跟踪我匹配的位置。

      【讨论】:

      • 我不能让它只返回我需要的匹配行,而是返回全部(搜索)或不返回任何内容(在正则表达式中使用匹配)。请问有什么可以改进的建议吗?
      • 我已经编辑了示例以逐行检查。但是在阅读了其他答案之后,我同意使用“csv”模块读取数据会更好,因为它可以轻松解析数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      相关资源
      最近更新 更多