Найти - Пользователи
Полная версия: Регулярное выражение не работает.
Начало » Python для новичков » Регулярное выражение не работает.
1
Jeck290
Имеется регулярное выражение

reg = ‘'</td><td><b>(.+)</b>d’'

имеется кусочек страницы которую нужно парсить

<TABLE width='450' class=form>
<tr><td colspan='2'><input type='hidden' name='UID' value='79'/></td></tr>
<tr><td>Депозит:</td><td><b>3.250000</b> &nbsp; &nbsp; <a title='Оплаты' class='payments rightAlignText' href=“91.241.160.3:9443/admin/index.cgi?index=2&amp;UID=79”>Оплаты</a> &nbsp; <a title='Снятие денег' class='fees rightAlignText' href=“92.341.160.3:9447/admin/index.cgi?index=3&amp;UID=79”>Снятие денег</a></td></tr>
<tr><td>Денежный счёт:</td><td>81</td></tr>

пишем texxt = re.search('</td><td><b>(.+)</b>d',r.text)
r.text - это страница полученная с сайта , тут я привел только нужный кусок

Получаем всегда результат None , причем если берем утилиту для тестирования регулярных выражений например Kiki или вводим эти данные на сайте RegExr то регулярное выражение работает и проблем с ним нету но питон упорно не хочет находить нужный результат. Забыл сказать найти нужно числа разделенные точкой в данном примере это число 3.250000
Пробовал еще вот такое выражение reg = ‘Депозит:</td><td><b>(\d+\.\d+)</b>’ тоже ничего не находит , наверное я допустил ошибку или чего то не понимаю , помогите , укажите что я делаю не так ((
Shaman
А
reg = "</td><td><b>(.+)</b>"
для
<TABLE width='450' class=form>
<tr><td colspan='2'><input type='hidden' name='UID' value='79'/></td></tr>
<tr><td>Депозит:</td><td><b>3.250000</b> &nbsp; &nbsp; <a title='Оплаты' class='payments rightAlignText' href=“91.241.160.3:9443/admin/index.cgi?index=2&amp;UID=79”>Оплаты</a> &nbsp; <a title='Снятие денег' class='fees rightAlignText' href=“92.341.160.3:9447/admin/index.cgi?index=3&amp;UID=79”>Снятие денег</a></td></tr>
<tr><td>Денежный счёт:</td><td>81</td></tr></b>
сработает?
Jeck290
Нет нет , не работает (
py.user.next
Jeck290
Имеется регулярное выражение

reg = ‘</td><td><b>(.+)</b>d’
и для чего там d в конце ?

>>> import re
>>> 
>>> s = """
... <TABLE width='450' class=form>
... <tr><td colspan='2'><input type='hidden' name='UID' value='79'/></td></tr>
... <tr><td>Депозит:</td><td><b>3.250000</b> &nbsp; &nbsp; <a title='Оплаты' class='payments rightAlignText' href=“91.241.160.3:9443/admin/index.cgi?index=2&amp;UID=79”>Оплаты</a> &nbsp; <a title='Снятие денег' class='fees rightAlignText' href=“92.341.160.3:9447/admin/index.cgi?index=3&amp;UID=79”>Снятие денег</a></td></tr>
... <tr><td>Денежный счёт:</td><td>81</td></tr>
... """
>>> 
>>> pat = r'</td><td><b>(.+)</b>'
>>> #pat = 'Депозит:</td><td><b>(\d+\.\d+)</b>'
... 
>>> m = re.search(pat, s)
>>> print(m and m.group(1))
3.250000
>>>
оба варианта работают (если d убрать)

единственное что - нужно поставить ленивую(нежадную) версию захвата
pat = r'</td><td><b>(.+?)</b>'

иначе может получиться похожая вещь:
>>> re.search(r'<(.+)>', '<b>abc</b>').group(1)
'b>abc</b'
>>>

add
заменил “ревнивую” на “ленивую”, так как ревнивая - это сверхжадная
lorien
> помогите , укажите что я делаю не так ((

Используете регулярки вместо связки lxml + xpath запросы
Jeck290
lorien
Да если бы у меня был xml файл то да все понятно что я не так делаю а так у меня на входе html :)

py.user.next
Спасибо действительно все работает , буква d просто так залетела ))

Всем спасибо за внимание.
py.user.next
Jeck290
Да если бы у меня был xml файл то да все понятно что я не так делаю а так у меня на входе html :)
не, дело в том, что может получиться такое:
<script>alert("</td><td><b>abc</b>")</script>
и оно найдет это дело в строке, когда должно искать только в тегах
а в lxml - нестандартном модуле - есть подмодуль lxml.html специально для html-тегов
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB