2014-09-08 2 views
3

Если у меня есть регулярное выражение, как это, например:Изменить порядок элементов найден re.findall

>>> text = 'asd321zxcnmzasd5' 
>>> re.findall('(asd)(\d*)', text) 
[('asd', '321'), ('asd', '5')] 

Как я могу сделать это изменить порядок элементов в кортеже? Как это, например:

[('321', 'asd'), ('5', 'asd')] 

Кортежи могут иметь более 2-х элементов, так что я не хочу, чтобы просто изменить порядок, или обратный текст перед применением регулярных выражений и использовать некоторые LOOKAHEAD/функции просмотра назад. Я хочу знать, могу ли я как-то установить порядок в RegEx так, как я бы назвал его именем с (?P<name>...)

+0

Почему вопрос заказа? – Barmar

+0

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

ответ

2

Использование finditer вместо findall:

>>> for res in re.finditer('(?P<str>asd)(?P<dig>\d*)', text): 
... print (res.group('dig'),res.group('str'))                               
... 
('321', 'asd') 
('5', 'asd') 

>>> [(res.group('dig'),res.group('str')) for res in re.finditer('(?P<str>asd)(?P<dig>\d*)', text)]                      
[('321', 'asd'), ('5', 'asd')] 
0

Вы можете использовать namedtuple. Что-то вроде этого (непроверенные)

from collections import namedtuple 

NT = namedtuple('NT', 'first second') 

def my_order(m): 
    new_order = [] 
    for item in m: 
     new_order.append((item.second, item.first)) 
    return new_order 


m = re.findall(NT('(asd)(\d*)'), text) 
my_m = my_order(m) 
0

Вы можете инвертировать кортежей с помощью

a=[('asd', '321'), ('asd', '5')] 
a= [tuple(reversed(i)) for i in a] 
print a 
print a[0][0] 
[('321', 'asd'), ('5', 'asd')] 
Смежные вопросы