python:regex只获取最后一次出现

时间:2012-02-01 22:07:22

标签: python regex

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

text = "aaaa[ab][cd][ef]"

a = re.compile("^(\w+)(\[\w+\])*$").findall(text)

print a

我需要所有这些,但它会返回:

[('aaaa', '[ef]')]

使用:

a = re.compile("\[\w+\]").findall(text)

我得到了所有这些,但第一个字出来了......

['[ab]', '[cd]', '[ef]']

这个文本是随机文本,因为stackoverflow标准质量

4 个答案:

答案 0 :(得分:3)

以下是如何做到这一点:

In [14]: a = re.compile(r"(\w+|\[\w+\])").findall(text)

In [15]: print a
['aaaa', '[ab]', '[cd]', '[ef]']

每个匹配返回一组字母(带或不带括号)。

答案 1 :(得分:1)

只有一个匹配:"^(\w+)"部分与"aaaa"匹配,"(\[\w+\])*$"部分与"[ab][cd][ef]"匹配。请注意,您将获得一个元素的列表(这是一个元组),因此只有一个匹配。您在regexp中使用的每对括号都会在元组中生成一个元素,其中的文本与其中的内容相匹配。有两对,因此元组中有两个元素。第二对括号是加星号的,但这只会导致结果被多次“分配”(看起来保留最后一个值):它不会使括号本身相乘,所以你不会得到更大的元组。 / p>

我不确定您的期望,所以我不知道建议使用什么样的正则表达式。

答案 2 :(得分:1)

根据您对aix答案的评论,您似乎希望要求非括号内的部分匹配,这可能是您要找的东西吗?

>>> a = re.compile(r"^(\w+)((?:\[\w+\])*)").findall(text)
>>> print a
[('aaaa', '[ab][cd][ef]')]

如果你需要得到结果['aaaa', '[ab]', '[cd]', '[ef]']而不是上面显示的是一种方法:

>>> match = re.compile(r"^(\w+)((?:\[\w+\])*)").search(text)
>>> a = [match.group(1)] + match.group(2).replace("][", "] [").split()
>>> print a
['aaaa', '[ab]', '[cd]', '[ef]']

答案 3 :(得分:0)

最后我用这段代码来做:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

text = "aaaa[ab][cd][ef]"

var = []
if re.match("^(\w+)(\[\w+\])*$", text):
        a = re.findall("^\w+", text)[0]
        var.append(a)
        b = re.findall("\[\w+\]", text)
        for i in b:
                var.append(i)
print var

输出:

['aaaa', '[ab]', '[cd]', '[ef]']

所有这些解决方案都很棒,谢谢:)。