我想找一个带文件的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)
的解释方式不同。我做错了什么?
答案 0 :(得分:1)
答案 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解析器,则需要使用文本编码,转义序列,多行标记和不同的引用样式。因此,如果您需要更强大的解决方案,请不要在此处使用正则表达式。