2015-09-04 3 views
2

Давайте этот текст:Получить несколько групп захвата в другом порядке?

2343 abcd 
ajek 4827 
1231 skj0 

И это регулярное выражение:

/(?:(?P<number>\d{4})\s+(?P<text>\w{4})|(?P<text>\w{4})\s+(?P<number>\d{4}))/Jg 

DEMO: https://regex101.com/r/yN9zK4/1

Если цель состоит в том, чтобы получить это:

{{ number: 2343, text: abcd }, 
{ number: 4827, text: ajek }, 
{ number: 1231, text: skj0 }} 

С и У меня есть не проблема, чтобы заставить мое регулярное выражение работать.

Кажется, что Python не предлагает опцию J. Как я могу заставить его работать с Python, используя другие механизмы, чем регулярные выражения?

+0

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

+0

Хорошо, я должен обновить свой вопрос, а затем – nowox

+0

Кроме регулярного выражения, я думаю, вы можете использовать более общее регулярное выражение (оба токена '\ w +') для соответствия строке и извлечение 2 токенов, затем выполните еще один тест, чтобы их классифицировать. – nhahtdh

ответ

2

Через расщепление только. Это приведет к созданию списка словарей.

import re 
from collections import OrderedDict 

with open(r'file') as f: 
    h = OrderedDict() 
    l = [] 
    for line in f: 
     d = {} 
     f = line.split() 
     for i in f: 
      if i.isdigit() and len(i) == 4: 
       d['number'] = i 
      else: 
       d['text'] = i 
     l.append(d) 

    print(l)  
+1

1 строка Perl против 13 строк Python. Вы сделали мой день :( – nowox

1

В вашем вопросе вы пишете структуру вывода {{a: 1}, {b: 2}, {c: 3}}. Эта структура невозможна, потому что вы не можете создать набор словарей в python. Наборы могут содержать только не измененные объекты, такие как числа, строки или кортежи.

Вы можете использовать список понимание и простые методы и функции разобрать этот текст в словаре структуру:

>>> multiline = '''2343 abcd 
... ajek 4827 
... 1231 skj0''' 
... 
>>> [{'number':y[0],'text':y[1]} for y in (sorted(x.split()) for x in multiline.split('\n'))] 
[{'text': 'abcd', 'number': '2343'}, {'text': 'ajek', 'number': '4827'}, {'text': 'skj0', 'number': '1231'}] 
>>> 

Или использовать линейный словарь генератор, например:

>>> {int(k):v for k,v in [sorted(x.split()) for x in multiline.split('\n')]} 
{4827: 'ajek', 1231: 'skj0', 2343: 'abcd'} 
Смежные вопросы