Skip to main content
 首页 » 编程设计

带有可选组的 python 正则表达式

2024年08月30日35xxx_UU

这里是正则表达式的新手,我将不胜感激。

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 -(这些是第二组中唯一预期的字符)但无济于事。

请您参考如下方法:

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

贪心意味着运算符会在检查下一个 token 之前尝试消耗所有它能消耗的东西。

所以对于

\S+\/? 

在/被检查之前,S 将尝试消耗它可以消耗的所有东西,并且由于/是可选的,因此不需要为它做任何事情。

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

\S+?\/? 

S 会在尝试/之前尽可能少地消耗,这意味着/会在任何 token 上获得“优先权”,一旦它未能捕获它们,这些 token 将针对\S+?

我使用以下方法取得了成功:

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

更多信息可以看the python re docs搜索贪婪。

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

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

我发现这对学习正则表达式很有帮助。

此外,您在组 '^ ([' 之外有字符串标记的开头,但在组 '(][ST]$)' 中有字符串标记的结尾,除了可读性之外,这应该没有什么区别。