python在文件中找到带有路径的图像

时间:2016-09-10 18:07:48

标签: python regex

我想找一个带文件的svgs或pngs。图像属于attribue v =“...”

文件的一部分如下所示:

<symbol alpha="1" type="marker" name="0">
<layer pass="0" class="SvgMarker" locked="0">
<prop k="angle" v="0"/>
<prop k="fill" v="#000000"/>
<prop k="name" v="../Downloads/Inkscape_vectorisation_test.svg"/>
<prop k="offset" v="0,0"/>
<prop k="offset_unit" v="MM"/>
<prop k="outline" v="#000000"/>
<prop k="outline-width" v="1"/>
<prop k="outline_width_unit" v="MM"/>
<prop k="size" v="hello.png"/>
<prop k="size_unit" v="MM"/>
</layer>

我希望得到一个列表:

[ '../下载/ Inkscape_vectorisation_test.svg', 'hello.png']

我的python代码:

import re
projectFile = open("project.xml", "r")
regex = re.compile(r'(?<=v\=").+(\.svg|\.png)(?="/>)')

for line in projectFile:
    result = regex.findall(line)            
    for filename in result:
        print filename

我用http://pythex.org/测试了我的正则表达式,但是在python控制台中结果只是.svg,似乎捕获组(\.svg|\.png)的解释方式不同。我做错了什么?

2 个答案:

答案 0 :(得分:1)

正在使用正则表达式吗?如果不是,则使用lxml更简单,更简洁的方法。

由于您希望的URI似乎显示在prop的{​​{1}}元素中,您可以使用xpath执行以下操作:

k="name"

答案 1 :(得分:0)

此操作失败,因为您使用的是regex.findall并且您的正则表达式中有一个组:(\.svg|\.png)。如果您将其更改为非捕获组(?:\.svg|\.png),则findall将找到整个匹配项。

请参阅re.findall doc,其中包含:

  

如果模式中存在一个或多个组,则返回列表   组;如果模式有多个,这将是一个元组列表   基。

>>> line = '<prop k="name" v="../Downloads/Inkscape_vectorisation_test.svg"/>'
>>>
>>> regex = re.compile(r'(?<=v\=").+(\.svg|\.png)(?="/>)')
>>> regex.findall(line)
['.svg']
>>>
>>> regex2 = re.compile(r'(?<=v\=").+(?:\.svg|\.png)(?="/>)')
>>> regex2.findall(line)
['../Downloads/Inkscape_vectorisation_test.svg']

或者您可以使用re.search,它将返回一个Match对象并为您提供更多控制权:

>>> match = regex.search(line)
>>>
>>> match.group(0)
'../Downloads/Inkscape_vectorisation_test.svg'
>>>
>>> match.group(1)
'.svg'

另一方面......

正则表达式只是半解决方案。如果您使用XML解析器,则需要使用文本编码,转义序列,多行标记和不同的引用样式。因此,如果您需要更强大的解决方案,请不要在此处使用正则表达式。