2016-04-22 2 views
0

Я пытаюсь использовать шаблоны re в scrapy для синтаксического анализа строки. Строка имеет следующий формат. Я пытаюсь получить номера в тегах шрифтов (например, 08:00). Достаточно легко сделать в одном списке (\d+:\d+)+, но мне нужны два отдельных списка: AM и PM. Можете ли вы сделать это, создав две подстроки - AM и PM - а затем запустив узор против каждой из подстрок? (AM - и (PM - являются уникальными. Похоже, вы должны быть способны сделать это напрямую, но у меня нет идей. Благодарю.Python re string parsing

Пример ввода:

(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 это хороший момент. Я просто боюсь перекомплементировать проблему для ОП и решил просто показать отправную точку, чтобы сделать данные более удобными для задачи. – 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