2016-04-13 5 views
1

У меня есть файл в формате CSV (или может счастливо быть .txt файл) с некоторыми записями в нем:Python регулярное выражение FindAll читать строки в CSV-файле

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

и т.д. и т.п.

У меня есть использовал питон, чтобы открыть и прочитать файл, то регулярный выражение 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'] 

Я протестировал это, и, похоже, у меня есть работающий поиск регулярных выражений, поскольку он правильно идентифицирует «совпадение» и возвращает его.

  1. Вопрос в том, как мне получить оставшееся содержимое строк «соответствий», которые будут возвращены? (в конце концов, я запишу это в новый файл, но на данный момент я просто хочу, чтобы строка соответствовала строке).

Я изучил словари python как один из способов индексирования вещей, но я ударил стену и получил не дальше, чем регулярное выражение, возвращающее положительный результат.

  1. Я думаю, что из этого может возникнуть второй вопрос: я вообще выбрал неправильный подход?

Надеюсь, что я был достаточно конкретным, первый вопрос здесь, и я потратил часы (а не минуты) на поиск конкретных решений и опробовал несколько идей. Я предполагаю, что это не особенно сложная концепция, но я мог бы сделать несколько намеков, если это возможно.

+0

Какую цель? Что вы хотите индексировать? –

+0

Моя цель состоит в том, чтобы хранить информацию о регистрационных таблицах с соответствующими именами и адресами. Регистрационная табличка будет идентифицирована в другой части системы, тогда я хотел бы, чтобы другие связанные детали были записаны в другой файл. Широкая идея заключается в том, что автомобиль может быть автоматически распознан, и детали владельца будут сгенерированы. (все гипотетические, хотя, я не snooping и т. д. –

ответ

2

Лучший способ справиться с этим - использовать модульPython. Из взглядов вашего 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'] 
+0

Это замечательно. Большое спасибо. В первый раз здесь потрясающе. –

+0

@TomShaw Так как вы здесь новые, я бы рекомендую вам читать [Что делать, если кто-то отвечает на мой вопрос?] (http://stackoverflow.com/help/someone-answers), потому что на ваш вопрос было задано несколько ответов от разных людей. – cpburnz

0

Если вы хотите прочитать все значения в CSV-файле и сохранить их в словаре с ключом как JB74XYZ и сведения, связанные с этим. Затем вы можете прочитать этот файл по строкам и просто использовать split(" "), чтобы получить список. Затем вы можете легко сделать словарь, просто удалив первый элемент из списка и сделав его ключом, и сохраните оставшийся список в качестве значения словаря. Если вы хотите использовать регулярный экспресс, вы должны сослаться на эту ссылку: https://docs.python.org/3/library/re.html для извлечения информации из вашего файла и сохранения ее в кортежах.

+0

Разметка, кажется, табуляция, а не пробел. –

+0

, который зависит от типа ввода, я полагаю @Suzana_K – N6t9N

+0

Ввод примера OP явно разделен на табу. –

0

Вы можете попробовать 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, что я хочу, чтобы отслеживать положение о том, что я соответствовал ,

+0

Я не мог получить это, чтобы просто вернуть подходящую строку, в которой я нуждаюсь, вместо этого он возвращает либо все (поиск), либо ничего (используя совпадение в регулярном выражении). предложите для уточнения, пожалуйста? –

+0

Вместо этого я отредактировал пример, чтобы проверить строку за строкой. Но, прочитав другие ответы, я согласен с тем, что было бы лучше читать данные с помощью модуля «csv», так как это упростило бы анализ –

1

Я бы использовал csv module, прочитал в файле с вкладкой в ​​качестве разделителя, а затем сравните строки за строкой. Если в этой строке есть совпадение, добавьте его в список результатов.

0

Итак, после того, как смотреть на все отличные ответы, я в конечном итоге фокусировки (как это было рекомендовано несколько здесь), чтобы посмотреть модуль 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']