2013-08-25 7 views
0

У меня есть много строк, как показано ниже в файле:Regex построчно над большой строкой

{"first_name":"John","last_name":"Smith","age":30} 
{"first_name":"Tim","last_name":"Johnson","age":34} 

я впервые попробовал импортировать это в качестве словаря с модулем JSon, так что я мог бы просто напечатать значения ключи. Проблема заключается в том, что некоторые из строк не имеют правильной фигурной скобки или имеют другие проблемы, и поля не находятся в одном порядке в строке. Это предотвращает импорт.

Итак, теперь я пытаюсь сделать это с помощью регулярного выражения. У меня есть следующее:

fo = open("c:\\newgoodtestsample.txt", "r") 
x = fo.read() 
match1 = re.search('first_name"(.*?)"(.*?)"', x) 
if match1: 
    print match1.group(2) 

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

(first_name|last_name|age)"(.*?)"(.*?)" 

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

+0

Не могли бы вы отредактировать свое сообщение примерами различных проблем, с которыми вы сталкиваетесь в файле? –

+0

Проблемы, которые мешают мне импортировать его с помощью модуля JSON или ошибки при попытке выполнить нижнее регулярное выражение? – Christopher

+1

Все, что отличается от двух первых строк, которые вы пишете, для просмотра разных случаев. Я прошу, потому что вы пишете «или имеете другие проблемы» в своем сообщении. –

ответ

1

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

Я также рекомендую вам использовать диспетчер контекста with, который автоматически закроет дескриптор файла после того, как все строки будут прочитаны, что легко сделать только с циклом for.

with open("c:\\newgoodtestsample.txt", "r") as fo: 
    for line in fo: 
     result = re.findallr'"(\w*?)":"?(\w*)"?', line) 
     d = {k:v for k,v in re.findall(r'"(\w*?)":"?(\w*)"?', line)} 
     if 'first_name' in d: 
      # print first_name into file 
     else: 
      # print empty first_name field 
+0

Спасибо Matti. Поэтому я могу напечатать все имена с этим, например. Единственная проблема заключается в том, что некоторые из строк не имеют имени. Как я могу заставить ваш код печатать «none» или что-то в этом роде, если поле first_name отсутствует? – Christopher

+0

В конечном итоге я буду помещать каждое поле в виде столбца в электронную таблицу, поэтому я не хочу, чтобы они выходили из строя, если поле отсутствует. – Christopher

+0

nm, я получил его для работы с выражением else. Я хотел бы убедиться, что могу использовать ваш метод, если я не могу закончить импорт json в словарь. спасибо! – Christopher

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