正则表达式在标签内查找字符串

时间:2015-09-24 10:54:30

标签: python regex xml expression

是否有人就如何制作正则表达式以查找<time></time>中的所有字符串有一些指导?以下代码中有3种情况。我必须使用正则表达式在列表中的时间和/时间之间返回3个字符串。

<tabular>
  <time from="2015-09-23T23:00:00" to="2015-09-24T00:00:00" period="3">
    <!-- Valid from 2015-09-23T23:00:00 to 2015-09-24T00:00:00 -->
    <symbol number="4" numberEx="4" name="Cloudy" var="04" />
    <precipitation value="0" />
    <!-- Valid at 2015-09-23T23:00:00 -->
    <windDirection deg="118.5" code="ESE" name="East-southeast" />
    <windSpeed mps="1.2" name="Light air" />
    <temperature unit="celsius" value="12" />
    <pressure unit="hPa" value="1010.4" />
  </time>
  <time from="2015-09-24T00:00:00" to="2015-09-24T06:00:00" period="0">
    <!-- Valid from 2015-09-24T00:00:00 to 2015-09-24T06:00:00 -->
    <symbol number="4" numberEx="4" name="Cloudy" var="04" />
    <precipitation value="0" />
    <!-- Valid at 2015-09-24T00:00:00 -->
    <windDirection deg="94.7" code="E" name="East" />
    <windSpeed mps="1.9" name="Light breeze" />
    <temperature unit="celsius" value="12" />
    <pressure unit="hPa" value="1010.4" />
  </time>
  <time from="2015-09-24T06:00:00" to="2015-09-24T12:00:00" period="1">
    <!-- Valid from 2015-09-24T06:00:00 to 2015-09-24T12:00:00 -->
    <symbol number="4" numberEx="4" name="Cloudy" var="04" />
    <precipitation value="0" minvalue="0" maxvalue="0.3" />
    <!-- Valid at 2015-09-24T06:00:00 -->
    <windDirection deg="122.9" code="ESE" name="East-southeast" />
    <windSpeed mps="2.6" name="Light breeze" />
    <temperature unit="celsius" value="12" />
    <pressure unit="hPa" value="1009.3" />
  </time>
</tabular>

6 个答案:

答案 0 :(得分:2)

它是一个xml文件,因此不使用正则表达式,为什么不使用XPATH。您可以使用名为lxml的python库来支持XPATH语言。我不知道您的确切用例,但示例代码应该是: -

from lxml import etree

xml_doc = etree.fromstring(xml_string) # assuming xml_string is xml_content

xpath_expression = '/tabular/time/text()' # change it according to your use case

data = xml_doc.xpath(xpath_expression)

XPATH Tutorial

答案 1 :(得分:1)

这将获取每个时间元素的内容,如下所示:

re.findall("<time[^>]*>(.*?)<\/time>",xmldata, re.DOTALL)

我仍然建议使用正则表达式的XML库。

如果您也想要time个元素,请使用:

re.findall("<time[^>]*>.*?<\/time>",xmldata, re.DOTALL)

答案 2 :(得分:1)

使用lxml

from lxml import etree

xmlString = '''<tabular>
...'''

tree = etree.fromstring(xmlString)

res = []

for timeNd in tree.xpath('//tabular/time'): 
    res.append(''.join([etree.tostring(node) for node in timeNd]))

print(res)

XPath查询//tabular/time选择所有time个节点,然后为每个节点连接子节点字符串,并将结果字符串附加到列表res

答案 3 :(得分:0)

试试这个

re.findall(r'<time[^>]*>.*?<\/time>', 'XMLSTRING', re.DOTALL)

答案 4 :(得分:0)

尝试

<time[^>]*>(.*?)<\/time>

返回三个匹配组。请查看here(请注意globalsingel line标记)

此致

答案 5 :(得分:0)

它无法完成,因为XML不是常规语言(这是计算机科学中的技术术语)。任何尝试都会捕获一些你不想捕获的字符串(例如,旨在混淆你的正则表达式匹配器的XML注释),或者无法捕获一些你应该匹配的字符串(例如,在你所做的地方包含注释的元素) #39; t期待他们)。要处理XML,请始终使用XML解析器。