匹配“没有这个”

时间:2011-10-04 18:16:27

标签: python regex

我需要删除<p></p>中仅<p>的所有<td>
但是怎么做呢?

import re
text = """
    <td><p>111</p></td>
    <td><p>111</p><p>222</p></td>
    """
text = re.sub(r'<td><p>(??no</p>inside??)</p></td>', r'<td>\1</td>', text)

如何匹配without</p>inside

4 个答案:

答案 0 :(得分:1)

我会使用minidom。我从here偷了以下代码片段,您应该可以修改并为您工作:

from xml.dom import minidom

doc = minidom.parse(myXmlFile)
for element in doc.getElementsByTagName('MyElementName'):
    if element.getAttribute('name') in ['AttrName1', 'AttrName2']:
        parentNode = element.parentNode
        parentNode.insertBefore(doc.createComment(element.toxml()), element)
        parentNode.removeChild(element)
f = open(myXmlFile, "w")
f.write(doc.toxml())
f.close()

谢谢@Ivo Bosticky

答案 1 :(得分:1)

虽然使用带有HTML的正则表达式很糟糕,但匹配不包含给定模式的字符串本身就是一个有趣的问题。

假设我们想要匹配以a开头并以z开头的字符串,并且只在内部找不到字符串bar时才取出其中的任何内容。< / p>

这是我的看法:"a((?:(?<!ba)r|[^r])+)z"

它基本上说:找到a,然后找到r之前没有ba,或者找不到r的东西(至少重复一次),然后找一个z。因此,bar无法潜入捕获组。

请注意,此方法使用“负向后视”模式,仅适用于固定长度的后视模式(如ba)。

答案 2 :(得分:0)

我肯定会建议使用BeautifulSoup。它是一个python HTML / XML解析器。

http://www.crummy.com/software/BeautifulSoup/

答案 3 :(得分:0)

不太确定为什么要删除没有结束标记的P标记。 但是,如果这是尝试清理代码,BeautifulSoup的一个优点是可以为您清理HTML:

from BeautifulSoup import BeautifulSoup
html = """
<td><p>111</td>
<td><p>111<p>222</p></td>
"""
soup = BeautifulSoup(html)
print soup.prettify()

这并没有摆脱你的无与伦比的标签,但它修复了丢失的标签。