Python正则表达式向后看
我有以下案文:Python正则表达式向后看,python,regex,parsing,Python,Regex,Parsing,我有以下案文: <clipPath id="p54dfe3d8fa"> <path d="M 112.176 307.8 L 112.176 307.8 L 174.672 270 L 241.632 171.72 L 304.128 58.32 L 380.016 171.72 L 442.512 217.08 L 491.616 141.48 L 491.616 307.8 z "/> </clipPath> <cli
<clipPath id="p54dfe3d8fa">
<path d="M 112.176 307.8
L 112.176 307.8
L 174.672 270
L 241.632 171.72
L 304.128 58.32
L 380.016 171.72
L 442.512 217.08
L 491.616 141.48
L 491.616 307.8
z
"/>
</clipPath>
<clipPath id="p27c84a8b3c">
<rect height="302.4" width="446.4" x="72.0" y="43.2"/>
</clipPath>
我需要用其他内容替换此部分。我能够获取整个
,但这对我没有帮助,因为我无法覆盖
元素中的id
请注意,还有其他我不想触摸的
元素。我只想更改
元素中的
元素
我认为答案与在clipPath元素之前选择所有元素并在Path部分结束有关。任何帮助都将不胜感激
我一直在使用它来寻求帮助,还看到了一些奇怪的行为(与多行和空格有关),这些行为与Python3.x代码的行为不同
以下是我尝试过的一些方法:
reg = r'(<clipPath.* id=".*".*>)'
reg = re.compile(r'(<clipPath.* id=".*".*>\s*<path.*d="(.*\n)+")')
reg = re.compile(r'((?<!<clipPath).* id=".*".*>\s*<path.*d="(.*\n)+")')
g = reg.search(text)
g
reg=r'()'
reg=re.compile(r')(\s*regex从来都不是解析xml的正确方法
下面是一个简单的独立示例,它使用lxml
:
from lxml import etree
text="""<clipPath id="p54dfe3d8fa">
<path d="M 112.176 307.8
L 112.176 307.8
L 174.672 270
L 241.632 171.72
L 304.128 58.32
L 380.016 171.72
L 442.512 217.08
L 491.616 141.48
L 491.616 307.8
z
"/>
</clipPath>
<clipPath id="p27c84a8b3c">
<rect height="302.4" width="446.4" x="72.0" y="43.2"/>
</clipPath>"""
# This creates <metrics>
root = etree.XML("<X>"+text+"</X>")
p = root.find(".//path")
print(p.get("d"))
- 首先,我创建主节点,因为有几个节点,所以我把它包装在一个任意的主节点中
- 然后我在任何地方寻找“路径”
- 一旦找到,我就会得到
d
属性
现在我正在更改d
的文本并将其转储:
p.set("d","[new text]")
print(etree.tostring(root))
现在输出如下所示:
...
<path d="[new text]"/>\n
...
在d分隔符之后取第二部分,然后在/>
分隔符之后取第一部分。保留多行格式。正则表达式从来都不是解析xml的正确方法
下面是一个简单的独立示例,它使用lxml
:
from lxml import etree
text="""<clipPath id="p54dfe3d8fa">
<path d="M 112.176 307.8
L 112.176 307.8
L 174.672 270
L 241.632 171.72
L 304.128 58.32
L 380.016 171.72
L 442.512 217.08
L 491.616 141.48
L 491.616 307.8
z
"/>
</clipPath>
<clipPath id="p27c84a8b3c">
<rect height="302.4" width="446.4" x="72.0" y="43.2"/>
</clipPath>"""
# This creates <metrics>
root = etree.XML("<X>"+text+"</X>")
p = root.find(".//path")
print(p.get("d"))
- 首先,我创建主节点,因为有几个节点,所以我把它包装在一个任意的主节点中
- 然后我在任何地方寻找“路径”
- 一旦找到,我就会得到
d
属性
现在我正在更改d
的文本并将其转储:
p.set("d","[new text]")
print(etree.tostring(root))
现在输出如下所示:
...
<path d="[new text]"/>\n
...
使用d分隔符后的第二部分,然后是/>
分隔符后的第一部分。保留多行格式。基于xml
的解决方案,用于编辑路径
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parseString('<X>' + my_xml + '</X>')
collection = DOMTree.documentElement
for clip_path in collection.getElementsByTagName("clipPath"):
paths = clip_path.getElementsByTagName('path')
for path in paths:
path.setAttribute('d', '[code i want]')
print DOMTree.toxml()
import xml.dom.minidom
#使用minidom解析器打开XML文档
DOMTree=xml.dom.minidom.parseString(“”+my_xml+“”)
collection=DOMTree.documentElement
对于collection.getElementsByTagName(“clipPath”)中的clip_路径:
path=clip\u path.getElementsByTagName('path'))
对于路径中的路径:
path.setAttribute('d','[我想要的代码]'))
打印DOMTree.toxml()
使用的数据:
my_xml = """
<clipPath id="p54dfe3d8fa">
<path d="M 112.176 307.8
L 112.176 307.8
L 174.672 270
L 241.632 171.72
L 304.128 58.32
L 380.016 171.72
L 442.512 217.08
L 491.616 141.48
L 491.616 307.8
z
"/>
</clipPath>
<clipPath id="p27c84a8b3c">
<rect height="302.4" width="446.4" x="72.0" y="43.2"/>
</clipPath>
"""
my_xml=”“”
"""
基于xml
的解决方案,用于编辑路径
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parseString('<X>' + my_xml + '</X>')
collection = DOMTree.documentElement
for clip_path in collection.getElementsByTagName("clipPath"):
paths = clip_path.getElementsByTagName('path')
for path in paths:
path.setAttribute('d', '[code i want]')
print DOMTree.toxml()
import xml.dom.minidom
#使用minidom解析器打开XML文档
DOMTree=xml.dom.minidom.parseString(“”+my_xml+“”)
collection=DOMTree.documentElement
对于collection.getElementsByTagName(“clipPath”)中的clip_路径:
path=clip\u path.getElementsByTagName('path'))
对于路径中的路径:
path.setAttribute('d','[我想要的代码]'))
打印DOMTree.toxml()
使用的数据:
my_xml = """
<clipPath id="p54dfe3d8fa">
<path d="M 112.176 307.8
L 112.176 307.8
L 174.672 270
L 241.632 171.72
L 304.128 58.32
L 380.016 171.72
L 442.512 217.08
L 491.616 141.48
L 491.616 307.8
z
"/>
</clipPath>
<clipPath id="p27c84a8b3c">
<rect height="302.4" width="446.4" x="72.0" y="43.2"/>
</clipPath>
"""
my_xml=”“”
"""
TL;DR:r'\s*TL;DR:r'\s*可以嵌套clipPath
吗?不,我不这样认为。看看你为什么要用regex这么做?这是xml
吗?你为什么不用xml.etree.ElementTree
或lxml
来嵌套clipPath?不,我不知道请这样写。请参见您为什么使用regex执行此操作?这是一个xml
?为什么不使用xml.etree.ElementTree
或lxml
?非常适合建议不使用正则表达式的解决方案。+1.永不说不;)使用lxml
或类似工具可能是更好的做法,但作者也表示他想学习regex@Aaron我明白,OP应该在其他方面进行练习,而不是在一种嵌套的语法语言上练习几种可能的语法,比如一个文本文件,其中包含每行数据这也太愚蠢了。(另外,由于我对xml一无所知,而且我可以在几分钟内通过反复试验找到自己的方法,这可以让更多的xml新手相信使用xml并不难,即使我个人讨厌xml)根据我个人的经验,我有时会遇到格式不好的xml,需要一些正则表达式lovin'Nice来建议一个没有正则表达式的解决方案。+1.永远不要说不;)使用lxml
或类似的方法可能是更好的做法,但作者也表示他想学习regex@Aaron我明白,,然后,OP应该在嵌套语法语言之外的其他语言上进行练习,该语言具有多个可能的语法,例如一个文本文件,其中包含逐行数据。如果OP想用正则表达式解析C或Java,那也太愚蠢了。(另外,由于我对xml一无所知,我可以在几分钟内通过反复试验找到自己的方法,这可以让更多的xml新手相信使用它并不难,即使我个人讨厌xml),我有时会遇到格式不好的xml,这需要一些正则表达式的支持。这几乎可以用正则表达式直接回答我的问题,这太棒了!我相信SVG/XML解析库中的一个就是我最终要用到的,但由于您的努力和解释,这将被标记为正确的。谢谢这几乎直接回答了我的问题,使用正则表达式,这太棒了!我相信SVG/XML解析库中的一个就是我最终要用到的,但由于您的努力和解释,这将被标记为正确的。谢谢这就是我最后做的。非常感谢。这就是我最后做的。非常感谢。