2015-09-24 79 views
-1

有没有人有关于如何使正则表达式找到<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> 
+0

“三串”是什么意思? – proycon

+0

对不起,我参加了三场比赛。 – TeaLoverGuy

+1

你想要所有时间元素的XML内容作为字符串吗?在任何情况下,我强烈建议使用像''lxml''这样的正确的xml库,而不是正则表达式。 – proycon

回答

2

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

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

0

试试这个

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

+0

这几乎工作,但它只是返回列表中的整个字符串。 我需要字符串分离,所以在这种情况下,它应该返回一个列表,其中包含3个元素。编辑为 – TeaLoverGuy

+0

以包含'?'使其不贪婪。抱歉。 –

+0

你是最棒的:D 它工作。干杯! – TeaLoverGuy

0

尝试

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

它返回三个匹配组。检查出来here(注意globalsingel line标志)

问候

1

这将抓住每一个时间元素的内容,如:

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

我还是会推荐一个XML图书馆在正则表达式虽然。

如果你想time元素本身在那里,然后使用此:

re.findall("<time[^>]*>.*?<\/time>",xmldata, re.DOTALL) 
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

0

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

相关问题