0

我有一个字符串s = "a{asdfgh{asf}xvc}defg}des}" ,我想"{asdfgh{asf}xvc}"使用正则表达式提取部分。我使用了正则表达式匹配

p = re.compile('(\{[\w|\W]+?\})')

但它会提取"{asdfgh{asf}". 提取零件的正确正则表达式是什么"{asdfgh{asf}xvc}"

另外:我要问的是'}'字符的第二次出现匹配。我如何匹配第 n 次出现。

4

4 回答 4

1

试试这个...

>>> 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}']
>>> 
于 2013-01-27T14:34:15.180 回答
0

你可以使用这个正则表达式

\{.*?\{[^{}]*\}.*?\}

第 N 次出现

(\{[^}{]*){N}[^{}]*([^{}]*\}){N} 

所以

对于 N=1 将匹配{xyz}

对于 N=2 将匹配{x{y}z}

于 2013-01-27T14:28:09.950 回答
0

}要在第一个 之后搜索第二个{,构建一个像这样的 RE:

{ <non-} text>} <non-} text>}

表示<non-} text>[^}]*,我们得到:

    {[^}]*}[^}]*}

如果您需要区分{}{}{{}}事情会变得更加复杂。一般来说,REs 不是处理嵌套的好工具:有一个深刻的数学结果使它如此。任何所谓的解决方法都是一个很快就会变得过于复杂的组合。但是,如果您知道您的括号模式是什么样的,并且您只想获得第二个},那么就可以了。

于 2013-01-27T15:01:15.050 回答
0

为了匹配你{的第二次出现,}你可以使用

\{(?:[^}]*\}){2}

为了匹配你可以使用{的第 n 次出现}

\{(?:[^}]*\}){n}

where(?:[^}]*\})是一个非捕获组,这{n}意味着必须连续出现 n 次才能产生匹配。

于 2013-01-27T17:19:58.433 回答