#!/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标准质量
答案 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]']
所有这些解决方案都很棒,谢谢:)。