2016-04-22 70 views
0

我想使用scrapy內的重新模式來解析字符串。該字符串具有以下格式。我試圖檢索字體標籤內的數字(例如08:00)。易於在一個列表(\d+:\d+)+做,但我需要兩個單獨的名單AMPM。你只能通過創建兩個子字符串來實現 - AMPM - 然後針對每個子字符串運行該模式? (AM -(PM -是獨一無二的。感覺你應該能夠直接做到,但我沒有想法。謝謝。Python重新字符串解析

例如輸入:

(AM – 07:00 <font color=#0002fe>08:00</font> <font color=#0000dd>09:00</font> <font color=#0001fe>10:100</font>) <br> (PM – 18:00 <font color=#0000fe>190:00</font> <font color=#0000fe>175:00</font>) 
+0

謝謝您的答覆。恐怕我原來的帖子不夠清晰。提供的字符串是一個示例,但是包含許多其他標記inc的較大字符串的一部分。
標籤如此分裂的方式建議不是一種選擇。關於BeautifulSoup,我沒有使用它,所以我認爲使用re可以更容易地將這兩個部分提取到子字符串中並按照指示解析它們。再次感謝。 – john

回答

3

我會先消除HTML標籤,並得到明文的工作。對於這一點,你可以使用HTML解析器,像BeautifulSoup

>>> from bs4 import BeautifulSoup 
>>> data = '(AM – 07:00 <font color=#0002fe>08:00</font> <font color=#0000dd>09:00</font> <font color=#0001fe>10:100</font>) <br> (PM – 18:00 <font color=#0000fe>190:00</font> <font color=#0000fe>175:00</font>)' 
>>> soup = BeautifulSoup(data, "html.parser") 
>>> data = soup.get_text() 
>>> AM, PM = data.split(" ") 
>>> AM 
u'(AM \u2013 07:00 08:00 09:00 10:100)' 
>>> PM 
u'(PM \u2013 18:00 190:00 175:00)' 
+0

而不是在整個輸入中調用'get_text()',爲什麼不在'
'標籤本身上分割? – dimo414

+0

@ dimo414這是一個很好的觀點。我只是害怕將OP的問題過分複雜化,並決定只是爲了使任務的數據更加方便而顯示出發點......感謝你。 – alecxe

1

如果你的字符串時,始終將會是什麼樣的例子,那麼你可以做到這一點使用下面的正則表達式:

import re 
capture = re.compile("(?<=>)[\d:]*(?=<)") 
res = capture.findall("(AM – 07:00 <font color=#0002fe>08:00</font> <font color=#0000dd>09:00</font> <font color=#0001fe>10:100</font>) <br> (PM – 18:00 <font color=#0000fe>190:00</font> <font color=#0000fe>175:00</font>)") 
for match in res: 
    print(match) 

這億韓元如果你有其他類型的標籤,那麼它就不起作用,因爲它只是找到了><之間的所有內容,並且沒有空格。

結果:

08:00 
09:00 
10:100 
190:00 
175:00