【问题标题】:Python regular expression select "Nissan" word except between <a>...</a> or <span>...</span> tagPython 正则表达式选择“Nissan”单词,除了 <a>...</a> 或 <span>...</span> 标记之间
【发布时间】:2014-11-23 11:38:26
【问题描述】:

观看直播regex101

我的正则表达式模式是

[Nn]issan(?=[^<>]*<)(?!(?:(?!</?(?:a|span)[ >/])(?:.|\n))*</(?:a|span)>)

我想停止在 nissan word.view 以下截图中捕获 url。

我使用 re.sub(pattern, new_word, paragraph, flags=re.U|re.M) 函数将这个 Nissan 单词替换为 new_word。

【问题讨论】:

  • 你想在这个锚标签&lt;a href="nissan.com"&gt;中匹配nissan
  • 不,我不匹配 href url 链接。我只想匹配不介于 &lt;a href="Nissan.com"&gt;Nissan&lt;/a&gt; or &lt;span&gt;Nissan&lt;/span&gt; 之间的 Nissan 单词。
  • @Veedrac 是正确的。更糟糕的是你试图在 python 中的 HTML 上使用正则表达式,而 python 拥有绝对令人惊叹的美丽汤库。制作这个 html 的汤然后删除所有锚和跨度标签将是微不足道的。然后返回遗骸中的任何匹配项。
  • 不要使用正则表达式来解析 HTML。别。别。 (叹气)

标签: python html regex


【解决方案1】:

你可以试试这个模式:

[Nn]issan(?=[^<>]*<)(?!(?:(?!</?(?:a|span)[ >/])(?:.|\n))*</(?:a|span)>)

据我所知,它有一个缺陷,那就是嵌套的 &lt;a&gt;&lt;span&gt; 标记可能会出错,导致它匹配如下内容:

<a>nissan<span></span><a>

See demo.

解释:

[Nn]issan
(?= # make sure it's not inside an <a> or <span> tag, like <a href="nissan">
    # to do that, we'll assert that the next "<" occurs before ">".
    [^<>]*
    <
)
(?! # next, make sure it's not enclosed in an <a> or <span> tag like <a>nissan</a>
    # to do that, we'll match anything up to the next "a" or "span" tag, either opening or closing, and then assert the tag is opening.
    (?: # while...
        (?! #...there is no opening or closing "a" or "span" tag
            <
            /?
            (?:
                a|span
            )
            [ >]
        )
        (?: # consume the next character.
            .|\n
        )
    )*
    # then assert the tag is not closing.
    </
    (?:
        a|span
    )
    >
)

【讨论】:

  • NO this regexp select Nissan name in a tag.
  • 不确定你的意思。你能举个例子吗?
  • 好的,让我有段落。并且当在我有另一个表存储单词(word,replace_word,url)之前将此段落插入数据库时​​,如果找到,则替换此段落文本。并且在存储但段落被修改后,有人再次重复相同的事情,所以我忽略了单词之间的 标记。
  • 请给我一些文字和预期的结果。类似“&lt;a&gt;nissan&lt;/a&gt; 中没有匹配项,但应该有。”
  • 我用实时视图更新了我的答案。请您检查一下,希望您理解正确。谢谢
【解决方案2】:
Nissan(?!((?!<\/a>).)*<\/a>|((?!<\/span>).)*<\/span>)

试试这个。查看演示。

http://regex101.com/r/dN8sA5/2

【讨论】:

  • 为什么每个结束标签都重复两次?是不是可以这样做:Nissan(?!.*&lt;\/a&gt;|.*&lt;\/span&gt;)
  • 你能告诉我这个正则表达式的范围是单行吗?
  • @user1153551 你发布的正则表达式有m flag。这也是单行。
  • 你的正则表达式对我有用,但不是 100% 归档了我的目标,我没有反对。你想帮助我,所以我放弃你了。
  • 请注意,此模式不会匹配 nissan&lt;a&gt;&lt;/a&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多