Python nongreedy第二场比赛
我有一个字符串Python nongreedy第二场比赛,python,regex,Python,Regex,我有一个字符串s=“a{asdfgh{asf}xvc}defg}des}” 我想使用正则表达式提取部分“{asdfgh{asf}xvc}”。 我使用了正则表达式匹配 p = re.compile('(\{[\w|\W]+?\})') 但它将提取“{asdfgh{asf}”。 提取部件“{asdfgh{asf}xvc}”的正确正则表达式是什么 此外: 我要求的是“}”字符的第二次出现匹配。 如何匹配第n次出现。您可以使用此正则表达式 \{.*?\{[^{}]*\}.*?\} 第n次发生 (\
s=“a{asdfgh{asf}xvc}defg}des}”
我想使用正则表达式提取部分“{asdfgh{asf}xvc}”
。
我使用了正则表达式匹配
p = re.compile('(\{[\w|\W]+?\})')
但它将提取“{asdfgh{asf}”
。
提取部件“{asdfgh{asf}xvc}”
的正确正则表达式是什么
此外:
我要求的是“}”字符的第二次出现匹配。
如何匹配第n次出现。您可以使用此正则表达式
\{.*?\{[^{}]*\}.*?\}
第n次发生
(\{[^}{]*){N}[^{}]*([^{}]*\}){N}
所以
对于N=1,将匹配{xyz}
对于N=2将匹配{x{y}z}
请尝试以下方法
>>> 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}']
>>>
要搜索第一个
{
之后出现的第二个}
,请按如下方式构建RE:
{
}
}
将
表示为[^}]*
,我们得到:
{[^}]*}[^}]*}
如果需要区分
{}{}
和{{}
,事情会变得更复杂。总的来说,REs不是处理嵌套的好工具:有一个深刻的数学结果使它如此。任何假定的解决方法都是一个很快就会变得太复杂的乱七八糟的问题。但是,如果您知道括号模式是什么样子,并且只想进入第二个}
,这就可以了。要从{
匹配到}
的第二个外观,您可以使用
\{(?:[^}]*\}){2}
\{(?:[^}]*\}){n}
要从
{
匹配到}
的第n个外观,可以使用
\{(?:[^}]*\}){2}
\{(?:[^}]*\}){n}
其中,
(?:[^}]*\})
是一个非捕获组,{n}
意味着必须连续出现n次才能生成匹配项。这将变得非常非常复杂。你确定正则表达式是适合你工作的工具吗?也许你需要一个解析器来代替(pyparsing
和朋友们)。给我们一个第n次发生的例子。{}
是不平衡的。{}
是否显示部分数据使用正常循环并计算开括号和闭括号的数量来提取字符串。Python正则表达式不适合该作业。[\w |\w]
表示“字母数字或非字母数字”。因此,这将匹配任何字符。在这种情况下,您应该只使用
。另外,+
表示“一个或多个”,而?
表示“零个或一个”。如果你想说“零或多”,你应该在+
之后立即使用*
@acattle:The?
使+
不贪婪,这就是为什么它在第一次}
时停止匹配。它假设金字塔结构{{{}}
,但是像这样的{}{}}
会失败。不过,你应该在回答中说明限制。@nhahtdh从他的例子中,我猜输入的形式总是{{}
。他需要澄清一下,..。@Some1.Kill.the.DJ结构总是像{}理论正则表达式无法做到这一点,但大多数现代语言都有一个比理论正则表达式更强大的正则表达式引擎。使用递归模式可以解决括号匹配问题。(但我并不赞成使用递归正则表达式)。递归REs允许您将整个下推自动机隐藏在它们后面,这会多次调用您的RE。Perl的“惰性正则子表达式”允许您在RE中嵌入任意Perl代码,因此它们实际上是图灵完整的!但是RE符号跟不上这种游戏,因此我的答案的最后一部分。(并不是说普通的RE不会失控……)