Python 非贪婪模式第二个匹配
我有一个字符串 s = "a{asdfgh{asf}xvc}defg}des}"
。我想用正则表达式提取出 "{asdfgh{asf}xvc}"
这一部分。
p = re.compile('(\{[\w|\W]+?\})')
但是我用的正则表达式只提取出了 "{asdfgh{asf}"
。那么,正确的正则表达式应该是什么,才能提取出 "{asdfgh{asf}xvc}"
呢?
另外,我想问的是,如何找到第二个出现的 '}' 字符。我该怎么匹配第 n 次出现的字符呢?
4 个回答
0
你可以使用这个正则表达式
\{.*?\{[^{}]*\}.*?\}
用于匹配第N次出现的情况
(\{[^}{]*){N}[^{}]*([^{}]*\}){N}
所以
当N=1时,会匹配到 {xyz}
当N=2时,会匹配到 {x{y}z}
0
要找到第一个 {
后面的第二个 }
,可以这样构建一个正则表达式(RE):
{<非}文本>
} <非}文本>
}
把 <非}文本>
表达成 [^}]*
,我们就得到了:
{[^}]*}[^}]*}
如果你需要区分 {}{}
和 {{}}
,事情就会变得复杂。一般来说,正则表达式不太适合处理嵌套的情况:这是有深奥的数学原理的。任何看似的解决办法都可能变得非常复杂。但如果你知道你的括号模式是什么样的,并且只是想找到第二个 }
,这个方法就可以用了。
1
试试这个...
>>> import re
>>> s = 'a{asdfgh{asf}xvc}defg}des}'
>>> p = re.compile('(\{[\w|\W]+?\}.+?\})')
>>> print p.findall(s)
['{asdfgh{asf}xvc}']
如果你需要再匹配一个,可以在正则表达式后面加上 .+?\}
。
>>> p = re.compile('(\{[\w|\W]+?\}.+?\}.+?\})')
>>> print p.findall(s)
['{asdfgh{asf}xvc}defg}']
>>>