更改re.findall找到的元素顺序

3 投票
3 回答
1155 浏览
提问于 2025-04-20 10:01

假设我有一个这样的正则表达式:

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

我想知道怎么能改变元组中元素的顺序?比如说,像这样:

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

这些元组可能有超过两个元素,所以我不想只是简单地反转顺序,也不想在应用正则表达式之前反转文本,或者使用一些前瞻/后顾的功能。我想知道是否可以在正则表达式中以某种方式设置顺序,就像我用(?P<name>...)给它命名一样。

3 个回答

0

你可以用下面的方法来反转元组。

a=[('asd', '321'), ('asd', '5')]
a= [tuple(reversed(i)) for i in a]
print a
print a[0][0]
[('321', 'asd'), ('5', 'asd')]
0

你可以使用一个命名元组。可以这样做(这个代码没有测试过)

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)
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')]

撰写回答