找到的元素的更改顺序重新查找

2024-09-30 16:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有这样一个正则表达式,例如:

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

我怎样才能改变元组中元素的顺序呢?例如:

^{pr2}$

元组可能有2个以上的元素,所以我不想仅仅颠倒顺序,或者在应用regex之前反转文本并使用一些lookahead/lookbehind函数。我想知道我是否能以某种方式设置正则表达式中的顺序,就像我给它起一个名称(?P<name>...)


Tags: 函数text文本re元素顺序方式regex
3条回答

你可以使用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)

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

您可以使用

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

相关问题 更多 >