Python非常规第二场比赛

时间:2013-01-27 14:22:37

标签: python regex

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

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

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

此外: 我要问的是'}'字符的第二次出现匹配。 我怎样才能匹配第n次出现。

4 个答案:

答案 0 :(得分: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}']
>>> 

答案 1 :(得分:0)

您可以使用此正则表达式

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

第N次出现

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

取值

N = 1的

将匹配{xyz}

N = 2的

将匹配{x{y}z}

答案 2 :(得分:0)

要在第一个}之后搜索{的第二次出现,请按以下方式构建RE:

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

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

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

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

答案 3 :(得分:0)

要从{匹配到}的第二个外观,您可以使用

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

要从{匹配到}的第n个外观,您可以使用

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

其中(?:[^}]*\})是非捕获组,{n}表示必须连续多次出现以产生匹配。