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解析库中的一个就是我最终要用到的,但由于您的努力和解释,这将被标记为正确的。谢谢这就是我最后做的。非常感谢。这就是我最后做的。非常感谢。