2017-07-05 13 views
1
import re 
string = 'Alabama[edit]' 
a = re.search(r'(\w+)(?:\(([\w+\s*]+)\))(\[.*\])',string).group(2) 

我在可选组中创建了(),但结果仍然返回无。 我想要实现的是,有两种不同类型的字符串:可选组python Rgx

1.Alabama [编辑] 2.Alabama(一些文本)[编辑]

我想无论是抽象没有,如果有没有圆括号或括号中的字符串。

而且我不知道为什么这不适用于可选的组我意味着如果有括号,这个表达式应该被忽略并捕获其余的组被捕获的权利?

(?:\(([\w+\s*]+)\)) 

谢谢! 埃里克

+0

那么你的问题到底是什么?请花点时间说出你想达到的目标,你的预期结果与实际结果如何。另请阅读:https://stackoverflow.com/help/how-to-ask –

+0

@ K.Kirsz谢谢你,我已经为我的问题编了版 –

回答

0

这似乎工作:

a = re.search('(\w+)(\([\w+\s*]+\))?(\[.*\])',string).groups() 
print(a) #('Alabama', None, '[edit]') 

在原来的表情,你没有使用可选的指示。为了使该组可选,您将?末尾,关闭后)。您使用的?:表示法意味着以下组将在结果中被忽略,但将始终考虑进行匹配。它基本上是说:“匹配此组,但我不想知道关于它的任何结果”

我想你毕竟想是这样的:

a = re.search('(\w+)(?:\([\w+\s*]+\))?(\[.*\])',string).groups()

这样:

import re 
s1 = 'Alabama[edit]' 
s2 = 'Alabama(test)[edit]' 
print(re.search(r'(\w+)(?:\(([\w+\s*]+)\))?(\[.*\])',s1).groups()) 
#('Alabama', None, '[edit]') 
print(re.search(r'(\w+)(?:\(([\w+\s*]+)\))?(\[.*\])',s2).groups()) 
#('Alabama', 'test', '[edit]') 
+0

谢谢!看起来像这样工作。我在帖子中提出了更加明确的问题,我不确定为什么我的代码中的可选组不能工作..... –

+0

令人惊叹!非常感谢你K. Kirsz!我想我对无捕获组和可选组感到困惑! –