python正则表达式与可选组

时间:2012-06-03 03:10:08

标签: python regex

这里是一个正念我的新手,我将不胜感激。

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 - (这些是第二组中唯一预期的字符),但没有用。

2 个答案:

答案 0 :(得分:3)

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

贪婪意味着操作员在检查下一个令牌之前会尝试消耗它所能做的一切。

对于

的情况
\S+\/?

S会在检查/之前尝试消耗它所能做的所有事情,并且因为/是可选的,所以不需要为它做任何事情。

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

\S+?\/?

在尝试/意味着/得到任何标记上的'第一个dib'之前,S将尽可能少地消耗,并且一旦它无法抓住它们,这些标记将被尝试对抗\ S +?

我使用以下内容找到了成功:

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

有关详细信息,请参阅the python re docs搜索贪婪。

作为旁注,如果将re.VERBOSE标志传递给re.compile,那么它将忽略字符串中的空格,这意味着您可以将其构造为

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

我在学习正则表达式时发现非常有帮助。

你也可以在一个组'^(['但是组'([] [$] $)'中字符串标记的结尾)之外的字符串标记的开头,这除了可读性之外不应该有所不同。 / p>

答案 1 :(得分: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