LINUX.ORG.RU

Убрать часть строки с помощью regex

 ,


1

1

Строка

<th class=«tableright»>& pound;1.95& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;</th> <th class=«tableright»>& pound;2.95& nbsp;& nbsp;</th>

Как убрать все, кроме 1.95?

у меня

            
elif 'th' in line and line.islower():
     d[alpha].append(re.sub('\s*<.*?>\D*\s*','', line))

получается (см. после MANGO), то есть в аналогичных строках (например, <th class=«tableright»>& pound;5.95</th>) текст удаляется,а цифры остаются,как видно ниже.

'GREAT ESCAPE', '3.95', 'MELON REFRESHER', '3.95', 'MIXED', '5.95', 'MANGO', '1.95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.95&nbsp;&nbsp;', 'LYCHEE', '1.95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.95&nbsp;&nbsp;'

Some people, when confronted with a problem, think «I know, I’ll use regular expressions.» Now they have two problems. (c)

Далее: не-регулярный синтаксис (в данном случае context-free) регулярными выражениями не парсится. Использую любой доступный парсер dom и бери значения уже от туда.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

Если костылять, то

>>> line1
'<th class=«tableright»>& pound;1.95& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;</th> <th class=«tableright»>& pound;2.95& nbsp;& nbsp;</th>'
>>> line2
'<th class=«tableright»>& pound;5.95</th>'
>>> import re
>>> pattern = re.compile(r'pound;[0-9]+\.[0-9]+')
>>> re.search(pattern, line1).group(0).split(';')[-1]
'1.95'
>>> re.search(pattern, line2).group(0).split(';')[-1]
'5.95'

Yorween
()

Зачем убирать, наоборот выгребай только числа.

>>> import re
>>> html = '<th class=«tableright»>& pound;1.95& nbsp;& nbsp;& nbsp;& nbsp;& nbsp;</th> <th class=«tableright»>& pound;2.95& nbsp;& nbsp;</th>'
>>> re.findall('[0-9]+\\.[0-9][0-9]', html)
['1.95', '2.95']
>>> list(map(float, re.findall('[0-9]+\\.[0-9][0-9]', html)))
[1.95, 2.95]

Эсли этого перестанет хватать, лучше бери lxml и парси html по-человечески.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 3)
Ответ на: комментарий от euZ3meep

Только вот html - это не xml (за исключением xhtml). Так что ничего человеческого.

Только вот lxml парсит не только xml. Так что ничего внетанкового.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

этот вариант отлично подошел. re.findall('[0-9]+\\.[0-9][0-9]', html)

спасибо всем ответившим.

hibiscusM
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.