Python Regex - работает в Expresso, а не в IronPython - PullRequest
0 голосов
/ 11 января 2011

Вернуться к тому же HTML, что я уже писал.Пытаюсь немного изучить RegEx, даже если я знаю, что есть другие способы.Я не тупой, просто как вызовы ...

Мое выражение:

publisher.php\?c=.*?\">(.*?)</a>(?:.*?)<br\s\\>(?:[\s\r\n]*?)Date:\s<time\sdatetime="(.*?)\">(?:.*?)(?:[\s\r\n]*?)Pages:\s*?(\d*?)<br\s\\>

Чтобы соответствовать чему-то в:

<p>Country: <a href="country.php?c=it">Italy</a><br \>
            Publication: <a href="publication.php?c=it/TL">Topolino (libretto)</a></p>
                Publisher: <a href="publisher.php?c=Mondadori">Mondadori</a><br><br \>
                    Date: <time datetime="1970-11-22">November 22, 1970</time><br \>
                    Pages: 196<br \>

                    Price: 150 Lit. <br \>
                    <span class="indexedBy">Index delivered by: <a href="mag-inx.php?c=ABo">ABo</a></span>

Если я проверю это вExpresso, отлично работает, но когда я запускаю его на Python, у меня сразу нет результата для группы 1 ...

Любая подсказка?

Спасибо,

M

Ответы [ 2 ]

2 голосов
/ 11 января 2011
  1. Все реализации регулярных выражений имеют тонкие различия. То, что он работает в экспрессе, не означает, что он работает в Python. Это также может быть вопрос о наличии значений по умолчанию для различных флагов, например, для пробелов и т. Д.

  2. Не используйте regexp для соответствия HTML или XML, если случай не тривиален. Используйте библиотеку, созданную для HTML / XML, например lxml или BeautifulSoup .

  3. Ваше регулярное выражение огромно, и у меня болит голова, когда я просто пытаюсь понять, как это работает. Смотри 2.

  4. Когда вы делаете это: \\> вы создаете обратную косую черту и размер больше скобки. Регулярное выражение будет интерпретировать это как буквальную скобку. Вам нужно три обратных слеша: \\\> или лучше: используйте необработанную строку, т.е. используйте r '' вместо ''.

  5. Используйте BeautifulSoup. На самом деле.

0 голосов
/ 11 января 2011

Как у вас это работает в Python? Вы избегаете его как необработанную строку? Вы добавили многострочный флаг?

Вы смешиваете двойные кавычки, одинарные кавычки и обратную косую черту таким образом, что это может вызвать проблемы. Например, этот бит выглядит странно:

c=.*?\">

Но, похоже, у меня работает с Python 2.6.6 на Linux x86.

$ cat expresso.py 
import re

str = r'''<p>Country: <a href="country.php?c=it">Italy</a><br \>
            Publication: <a href="publication.php?c=it/TL">Topolino (libretto)</a></p>
                Publisher: <a href="publisher.php?c=Mondadori">Mondadori</a><br><br \>
                    Date: <time datetime="1970-11-22">November 22, 1970</time><br \>
                    Pages: 196<br \>

                    Price: 150 Lit. <br \>
                    <span class="indexedBy">Index delivered by: <a href="mag-inx.php?c=ABo">ABo</a></span>'''

pat = r'publisher.php\?c=.*?\">(.*?)</a>(?:.*?)<br\s\\>(?:[\s\r\n]*?)Date:\s<time\sdatetime="(.*?)\">(?:.*?)(?:[\s\r\n]*?)Pages:\s*?(\d*?)<br\s\\>'
res = re.search(pat, str, re.MULTILINE)
print res.groups()

$ python expresso.py
('Mondadori', '1970-11-22', '196')
...