我需要删除<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
?
答案 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解析器。
答案 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()
这并没有摆脱你的无与伦比的标签,但它修复了丢失的标签。