2015-06-25 106 views
0

我使用python + lxml來分析spss文件。python lxml:不區分大小寫的xpath標記名稱匹配

這個主題似乎有很多線索,但答案並不特別幫助我。

的答案我也碰到過:

- lower-case the entire input before parsing; 
- if you know the complete list of tags in advance 

對我來說,這些建議將花費太多時間。

相反,我只想在必要時匹配字符串。

這是我想的代碼行編輯:

xpath("//definition//variable[@name='"+tag_name+"']") 

我怎樣才能得到一擊,如果TAG_NAME是:

tag_name = "Q1top" 
tag_name = "q1Top" 
tag_name = "q1TOP" 
etc 

我猜某種形式的正則表達式會爲了???

+0

ÿ我們的問題令人困惑,因爲XML中的「標籤名稱」通常表示一個元素名稱,但您所匹配的內容似乎是屬性的值。 –

回答

3

或者,您可以在XPath從http://exslt.org/regular-expressions命名空間包含的正則表達式,例如:

ns = {"re": "http://exslt.org/regular-expressions"} 
query = "//definition//variable[re:test(@name, '^{0}$', 'i')]".format(tag_name) 
result = tree.xpath(query, namespaces=ns) 
+0

re:測試? havnt在之前看到過,認爲它將會是:匹配 –

+0

@ Boosted_d16請參閱要比較的文檔:['''''''''''''''(''re:'''' '](http://exslt.org/regexp/functions/match/)。就我的簡單測試問題而言,兩種方法都有效 – har07

+0

啊,我明白了。非常感謝! –

1

使用local-nametranslate XPath函數:

>>> import lxml.etree 
>>> 
>>> root = lxml.etree.fromstring(''' 
... <root> 
...  <parent> 
...   <Q1top>1</Q1top> 
...   <q1Top>2</q1Top> 
...   <q1TOP>3</q1TOP> 
...  </parent> 
... </root> 
... ''') 
>>> root.xpath('.//*[translate(local-name(), ' 
...   '"ABCDEFGHIJKLMNOPQRSTUVWXYZ", ' 
...   '"abcdefghijklmnopqrstuvwxyz")="q1top"]') 
[<Element Q1top at 0x7fd663354a28>, 
<Element q1Top at 0x7fd663354830>, 
<Element q1TOP at 0x7fd6633549e0>] 

UPDATE

>>> root.xpath('.//*[translate(local-name(), ' 
...   '"QTOP", ' 
...   '"qtop")="q1top"]') 
[<Element Q1top at 0x7fd663354a28>, 
<Element q1Top at 0x7fd663354830>, 
<Element q1TOP at 0x7fd6633549e0>] 
+1

爲什麼不'translate(local-name(),「QTOP」,「qtop」)=「q1top」?' – splash58

+0

@ splash58,啊,很好的建議。順便說一句,使用'abcde ....'會更一般。我根據你更新了答案。 – falsetru

+0

好吧,我只是出於好奇:) – splash58