2016-09-10 18 views
2

ファイルを持つsvgsまたはpngsを探したいと思います。ファイルの一部は次のようになり画像が= attribue Vにある "..."pythonファイル内のパスを持つ画像を見つける

:「[

<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> 

私のようなリストを取得したいのですが。 ./Downloads/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)の解釈が異なるようです。私は間違って何をしていますか?

答えて

1

正規表現を使用していますか?そうでない場合は、lxmlを使用する方が簡単で洗練された方法になります。

それはあなたが望むURIがk="name"prop要素に表示されるようだと、あなたのような何かをするxpathを使用することができます。

from lxml import etree 
f = etree.parse(projectFile) 
root = f.getroot() 
# This will give you a list with all prop elements that contain the URIs you want in the v attribute 
elements = root.xpath("//prop[@k='name']") 
+1

これは受け入れられる回答でなければなりません - +1! – Jan

+0

お返事ありがとうございました!正規表現は必須条件ではありません。要素を印刷したり、ループしたりするときの2つの質問は、とはどういう意味ですか?見つかった項目を印刷する方法は?そして、私はこれをsvgとpngにどのように制限しますか? –

+0

あなたが印刷したいものは、あなたが望むURIを含む要素です(例えば '') これらの要素があるので、あなたがする必要があるのは、 'v'属性にアクセスすることだけです。これはあなたにURI(' "../ Downloads/Inkscape_vectorisation_test.svg" ')を与えます。 – lucasnadalutti

0

あなたがregex.findallを使用していると、あなたの正規表現のグループを持っているので、これは失敗しました:(\.svg|\.png)。これを非キャプチャグループ(?:\.svg|\.png)に変更すると、findallが完全一致します。

氏は述べている、re.findall doc参照してください:1つ以上のグループが、パターン中に存在する場合

は、 グループのリストを返します。パターンに2つ以上の グループがある場合、これはタプルのリストになります。

>>> 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'] 

それとも、Matchオブジェクトを返しますre.searchを、使用しており、より多くの制御与えることができる。一方

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

を...

正規表現のみです半解決策。代わりにXMLパーサを使用すると、テキストエンコーディング、エスケープシーケンス、複数行タグ、異なる引用スタイルの場合があります。したがって、より堅牢なソリューションが必要な場合は、ここで正規表現を使用しないでください。

+0

zvone、私はちょうどPythonで始まっています。あなたの答えは私を助けました。なぜpng参照が見つからないのですか?それはグループのpngの部分が一致しない縫い目です。 –

+0

@tBookそれはpngとsvgの両方を見つけるはずです。あなたの例では、正規表現を変更するだけで動作するはずです。 – zvone

関連する問題