我有一个字符串s = "a{asdfgh{asf}xvc}defg}des}"
,我想"{asdfgh{asf}xvc}"
使用正则表达式提取部分。我使用了正则表达式匹配
p = re.compile('(\{[\w|\W]+?\})')
但它会提取"{asdfgh{asf}"
. 提取零件的正确正则表达式是什么"{asdfgh{asf}xvc}"
。
另外:我要问的是'}'字符的第二次出现匹配。我如何匹配第 n 次出现。
试试这个...
>>> import re
>>> s = 'a{asdfgh{asf}xvc}defg}des}'
>>> p = re.compile('(\{[\w|\W]+?\}.+?\})')
>>> print p.findall(s)
['{asdfgh{asf}xvc}']
如果您需要再匹配一个,只需附加.+?\}
到 re。
>>> p = re.compile('(\{[\w|\W]+?\}.+?\}.+?\})')
>>> print p.findall(s)
['{asdfgh{asf}xvc}defg}']
>>>
你可以使用这个正则表达式
\{.*?\{[^{}]*\}.*?\}
第 N 次出现
(\{[^}{]*){N}[^{}]*([^{}]*\}){N}
所以
对于 N=1 将匹配{xyz}
对于 N=2 将匹配{x{y}z}
}
要在第一个 之后搜索第二个{
,构建一个像这样的 RE:
{ <non-} text>
} <non-} text>
}
表示<non-} text>
为[^}]*
,我们得到:
{[^}]*}[^}]*}
如果您需要区分{}{}
,{{}}
事情会变得更加复杂。一般来说,REs 不是处理嵌套的好工具:有一个深刻的数学结果使它如此。任何所谓的解决方法都是一个很快就会变得过于复杂的组合。但是,如果您知道您的括号模式是什么样的,并且您只想获得第二个}
,那么就可以了。
为了匹配你{
的第二次出现,}
你可以使用
\{(?:[^}]*\}){2}
为了匹配你可以使用{
的第 n 次出现}
\{(?:[^}]*\}){n}
where(?:[^}]*\})
是一个非捕获组,这{n}
意味着必须连续出现 n 次才能产生匹配。