2015-09-24 82 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解析器。

相關問題