2014-10-21 5 views
0

У меня есть файл ввода, который содержит данные, отформатированные следующим образом:Создать новую строку на основе каждого регулярного выражения в python

a; b, c | derp derp "X1234567, Y1234567, Z1234567" derp derp a; b, c |

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

Выход для приведенного выше примера будет:

а; b, c | derp derp X1234567 derp derp a; b, c |

a; b, c | derp derp Y1234567 derp derp a; b, c |

a; b, c | derp derp Z1234567 derp derp a; b, c |

До сих пор у меня есть что-то вроде этого:

import re 
prefix = re.compile ('^(.*?)"') 
pattern = re.compile('\"(.*?)([A-Z]{1}[0-9]{7})(.*?)\"') 
suffix = re.compile ('"(.*?)$') 
for i, line in enumerate(open('myFile.txt')): 
    for match in re.finditer(pattern, line): 
     print prefix, match.group(), suffix 

Но это только кажется, возвращает первый матч каждого из содержимого.

ответ

0

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

#!/usr/bin/env pytohn 

with open('myFile.txt','r') as f: 
    lines = readlines(f) 

for line in lines: 
    line = line.strip() 
    start = line.find('"') 
    end = line.find('"',start+1) 
    data = line[start+1:end].split(',') 
    data = [x.strip() for x in data] 
    for x in data: 
     print line[:start],x,line[end+1:] 

Вот что я нашел после того, как взглянуть на код, который вы публикуемую:

  • Вы на самом деле печать SRE_Pattern объекты для prefix и suffix в печатной линии , Вы должны записывать совпадения для префикса и суффикса на каждой итерации внешнего цикла.
  • Вызов match.group() вернет весь матч, а не только то, что находится в круглых скобках. Я думаю, что вы хотите match.group(1) в большинстве случаев.
  • Имея pattern, определенный как это, соответствует только одной строке, потому что он последовательно ищет строки для стартовой метки кавычек, за которой следует остальная часть шаблона. Поэтому он попадает в индекс для первой кавычки, проверяет один раз для шаблона, находит X1234567 и затем переходит.
  • Я не уверен, почему у вас есть обратные косые черты перед кавычками в pattern, так как я не думаю, что это специальные символы.
  • В вашем suffix он будет соответствовать первой котировке, а не второй, и таким образом suffix будет включать материал между кавычками.
  • Оператор печати вставляет пробелы между пунктами, если вы используете запятые, поэтому вы должны их конкатенировать, используя вместо этого +.

И, наконец, вот что я закончил с для регулярных выражений:

#!/usr/bin/env python 

import re 

prefix = re.compile('^(.*?)"') 
quotes = re.compile('".*?(.*).*?"') 
pattern = re.compile('[A-Z]{1}[0-9]{7}') 
suffix = re.compile('".*"(.*?)$') 

for (i,line) in enumerate(open('myfile.txt')): 
    pre = prefix.search(line).group(1) 
    data = quotes.search(line).group(1) 
    suf = suffix.search(line).group(1) 
    for match in re.finditer(pattern,data): 
     print pre+match.group(0)+suf 

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

+0

Отличный трюк! – didjit

Смежные вопросы