2012-10-27 34 views
0

我一直在努力,以配合標籤名稱僅(不<>標誌)是正規標籤的情況:Python的XML正則表達式匹配問題

<w:tag w:attrib1="http://url" w:attrib2="anyValue">

不匹配獨奏標籤(opening-關閉標籤):

<w:tag2 w:attrib1="anyValue" w:attrib2="http://url" />

(請注意網址的屬性,因爲它們含有斜槓(/))

,但不能設法得到它:

regex = re.compile('(?<=<)w:\w+(?=[\w\W]+>)(?!\s/>)')

print(regex.findall(string))

得到這個:

['w:tag','w:tag2']

期待這樣的:

['w:tag']

有什麼想法?

乾杯。

回答

0

發現:

regex = re.compile('(?<=<)w:\w+(?=>)|(?<=<)w:\w+(?=[\s\w+:\w+="[\w/:.-]+"]{0,10}>)') 
1

1)轉到容易對先行/回顧後;他們很難控制,你很少真正需要他們。使用捕獲組來提取部分匹配的字符串。使用負面字符類別和非貪婪搜索(如果需要)以避免匹配太多:

re.findall(r'<\s*(w:\w+)[^>]*(?<!/)>', string) 

更容易閱讀,不是嗎?但是,

2)不要這樣做!不要依賴RE來匹配XML或HTML,你只是要求心碎。有關詳細信息,請參見https://stackoverflow.com/a/1732454/699305。 :-)請熟悉使用python的xml.etree.ElementTree代替xpath表達式。這將需要一些習慣,但它會花費時間 - 你不會後悔。

+0

我很熟悉XML和lxml,並且很喜歡它。雖然這次我需要處理一些破碎的東西......感謝您的詳細解答。它像魅力一樣工作,而且看起來比我想象的更好。 – devdc