python lxml:不区分大小写的 xpath 标签名称匹配
python lxml: case insensitive xpath tag name matching
我正在使用 python + lxml 来解析 spss 文件。
关于这个话题似乎有很多话题,但答案对我没有特别帮助。
我遇到的答案:
- 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
我猜某种形式的正则表达式是有序的???
使用 local-name
, translate
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>]
更新
>>> root.xpath('.//*[translate(local-name(), '
... '"QTOP", '
... '"qtop")="q1top"]')
[<Element Q1top at 0x7fd663354a28>,
<Element q1Top at 0x7fd663354830>,
<Element q1TOP at 0x7fd6633549e0>]
或者,您可以将来自 http://exslt.org/regular-expressions
命名空间的正则表达式合并到 XPath 中,例如:
ns = {"re": "http://exslt.org/regular-expressions"}
query = "//definition//variable[re:test(@name, '^{0}$', 'i')]".format(tag_name)
result = tree.xpath(query, namespaces=ns)
我正在使用 python + lxml 来解析 spss 文件。
关于这个话题似乎有很多话题,但答案对我没有特别帮助。
我遇到的答案:
- 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
我猜某种形式的正则表达式是有序的???
使用 local-name
, translate
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>]
更新
>>> root.xpath('.//*[translate(local-name(), '
... '"QTOP", '
... '"qtop")="q1top"]')
[<Element Q1top at 0x7fd663354a28>,
<Element q1Top at 0x7fd663354830>,
<Element q1TOP at 0x7fd6633549e0>]
或者,您可以将来自 http://exslt.org/regular-expressions
命名空间的正则表达式合并到 XPath 中,例如:
ns = {"re": "http://exslt.org/regular-expressions"}
query = "//definition//variable[re:test(@name, '^{0}$', 'i')]".format(tag_name)
result = tree.xpath(query, namespaces=ns)