负面的背后问题

时间:2011-05-23 00:00:08

标签: python regex

以下是示例文本(从原文简化):

<start1>
<name="4654">
bla bla bla bla
<tags="bla" model="c">
bla bla bla bla
<start2>
<name="12346">
bla bla bla bla
<tags="bla" model="d">
bla bla bla bla
<start3>
<name="73535">
bla bla bla bla
<tags="bla" model="c">
<start4>
<name="546875">
bla bla bla bla
<tags="bla" model="c">
bla bla bla bla

这是我的正则表达式(点匹配新行选项已启用)

name="([\d]+)".+?(?<!start)tags="([^"]+?)" model="c"

正如您所看到的,有4个区块,但我需要匹配那些带有model =“c”的区块。但是.+?捕获的内容超出了需要。设防负面观察以抑制它不起作用......任何想法如何排除阻止?

更新(澄清我想要实现的目标):

我希望在3个块之后匹配样本数据:

第一场比赛

<name="4654">
bla bla bla bla
<tags="bla" model="c">

第二场比赛

<name="73535">
bla bla bla bla
<tags="bla" model="c">

第三场比赛

<name="546875">
bla bla bla bla
<tags="bla" model="c">

2 个答案:

答案 0 :(得分:2)

是否始终采用(startnametags),(startname,{{1}的格式}), 等等?如果是这样,你甚至可以不用环顾。

tags

这是有效的,因为您知道您遇到的下一个/<name="(\d+)"[^<]+?<tags="([^"]+?)" model="c">/s 将是紧随其后的<标签。我们可以保证是这种情况,还是我们需要更一般地允许混合中的其他标签?

此外,您是否需要在tags之后和下一个<tags>之前捕获文字?如果是这样,你可以为此添加一些额外的东西。

<start>

<击>

好的,根据你的评论,情况并非如此。然后抓一点。


更新

好的,怎么回事呢?

/<name="(\d+)"[^<]+?<tags="([^"]+?)" model="c">[^<]*(?!<start)/s

这实际上使用的是前瞻,而非后视。一个简单的超前/ lookbehind只会声明一个字符串出现在一个文本块之前或之后,而不是在一个文本块之内。通过使用/<name="(\d+)"(?:(?!<start).)+<tags="([^"]+?)" model="c">/s 检查每个字符,您可以有效地确保整个文本中不包含“str”。

我使用前瞻检查((?!str).)+可能看起来很混乱,而<start的后瞻看起来像start而不是(?<!start)
请考虑(?!<start)(?!(<start))

我添加(?<!(start))只是为了不会捕获。

答案 1 :(得分:0)

尝试更改排除模式,使模型=“c”非贪婪,而不是消极的外观。

name="([\d]+)".+?(?!model=)tags="([^"]+?)" model="c"