2012-06-03 56 views
1

正则表达式的新手在这里,我将不胜感激任何帮助。python正则表达式与可选组

cstring = "[0,90,(+45,45)3,0/]S" 
regex = re.compile(r'^(\[)(\S+)(\/?)(\][ST]$)') 
match = regex.search(cstring) 
for s in match.groups(): 
    print s 

的结果是 “[” “0.90,(+ 45,45)3,0 /” “] S”,但我想获得在一个单独的(和任选的 “/” - 的只有一个从上面)组。我尝试用[0-9(),+ - ] - (这些是第二组中预期的唯一字符)替换\ S,但无济于事。

回答

3

正则表达式的数量说明符+和*是贪婪的,你可以添加一个?到他们的最后(+?和*?)将它们变成非贪婪形式。

贪婪意味着操作员会在检查下一个标记之前尝试消耗所有可能的东西。

所以对于

\S+\/? 

的情况下,S将尝试消耗一切可能的检查/之前,而随着/可选没有什么需要为它做。

一旦我们将它变成非贪婪形式

\S+?\/? 

的S将尽可能少地消耗尝试/这意味着/获取“第一的DIB”上的任何令牌之前,一旦失败抓住他们这些代币将被用来对付\ S +?

我发现成功使用下列内容:

regex = re.compile(r'^(\[)(\S+?)(\/?)(\][ST]$)') 

欲了解更多信息,你可以看到the python re docs搜索贪婪。

仿佛你通过了re.VERBOSE选项为re.compile那么它会忽略你的字符串中的空白意味着你可以构建它作为

regex = re.compile(r'^ (\[) (\S+?) (\/?) (\][ST]$) ', re.VERBOSE) 

我学习正则表达式的时候发现非常有用旁注。

此外,您还有一个字符串标记开始于组'^(['但是组''(] [ST] $)'内的字符串标记的结尾),除了可读性外,这不应该有所作为。 。

+0

谢谢,这是我一直在寻找for。 – LeeUser1335457

0

尝试使用您\S人物非贪婪匹配该小组正席卷你的/性格

改变你的正则表达式来这工作对我来说:

cstring = "[0,90,(+45,45)3,0/]S" 
regex = re.compile(r'^(\[)(\S+?)(\/?)(\][ST]$)') 
match = regex.search(cstring) 
for s in match.groups(): 
    print s 
+0

感谢Blender,i吨现在排序 – LeeUser1335457