Предикат XPath может сделать это с помощью встроенной функции starts-with()
. Но вам нужно использовать библиотеку, которая полностью поддерживает XPath 1.0, такую как lxml
:
from lxml import etree as ET
raw = '''<rpc-reply>
<configuration>
<system>
<preference>
<events>123</events>
<events>124</events>
<events>1235</events>
</preference>
</system>
</configuration>
</rpc-reply>'''
root = ET.fromstring(raw)
query = 'configuration/system/preference/events[starts-with(.,"123")]'
print([events.text for events in root.xpath(query)])
Если вы все еще хотите использовать регулярные выражения, lxml
поддерживает регулярные выражения, несмотря на то, что спецификация XPath 1.0 поддерживаетне включает регулярное выражение (см .: регулярное выражение в lxml для python ).
xml.etree
поддерживает только ограниченное подмножество XPath 1.0 выражения, которое не включает starts-with
функция (и определенно не поддерживает регулярные выражения). Поэтому вам нужно полагаться на строковую функцию Python, чтобы проверить, что:
....
query = 'configuration/system/preference/events'
print([events.text for events in root.findall(query) if events.text.startswith('123')])