Python 非贪婪模式第二个匹配

0 投票
4 回答
2084 浏览
提问于 2025-04-17 13:50

我有一个字符串 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}']
>>> 

撰写回答