re.search
«s первым аргументом документирована как шаблон строки повторно, т.е. не скомпилированный объект RE - возможно, лучший дизайн должен был бы принять либо полиморфно, но, увы !, назад, когда разрабатывался модуль re
, это просто не ho Мы сделали это. Ну что ж, по крайней мере, это так же по всем функциям модуля в re
, которые имитируют методы re
скомпилированных объектов -!)
Однако, в какой-то момент в долгой и легендарную историю Пайтона, кто-то фиксированный наш оригинальный рительных дизайн (я не могу сказать, когда это произошло!): в настоящее время, хотя для большинства функций re
первый аргумент pattern
по-прежнему считается строкой шаблона RE, некоторые из них теперь документируются как «может быть строкой или RE объект "... и все из них, кажется, работают так (лучше!).
Так что если у вас есть скомпилированный re
, в теории, согласно (большинство из) Документов, необходимо вызвать его методы (и это вообще лучший подход, за исключением самого короткого из сниппетов), а не передайте его на re
функции уровня модуля, такие как re.search
. Но на практике, скомпилированный объект re
будет таким же прекрасным, как и задокументированный образец RE.
Человек, хорошо, что я узнал об этом, когда я начинаю готовить (с двумя соавторами) третье издание «Python в двух словах» ... по крайней мере, я получу «исправить документы», для что! -)
Добавлено: для измерения скорости, как обычно, timeit
- твой друг!
$ python -mtimeit -s'import re; s="paris in the spring"; mre=re.compile("paris")' 're.match("paris", s)'
1000000 loops, best of 3: 1.38 usec per loop
против:
$ python -mtimeit -s'import re; s="paris in the spring"; mre=re.compile("paris")' 'mre.match(s)'
1000000 loops, best of 3: 0.468 usec per loop
Итак, в целом, вы можете получить около 3 раза быстрее re.compile
щих вещей сразу, чем пропускающий re
функция обрабатывать все для вас. Посмотрите, почему я поклонник подхода re.compile
? -)
Кроме того, в Python «более быстрый» имеет тенденцию сильно коррелировать с «более Pythonic» (другими словами, «идиоматический в Python»). Когда вы не знаете, какой из двух подошел, более Pythonic, timeit
их правильно (желательно с использованием подхода командной строки python -mtimeit
), и если любой из подходов надежно работает быстрее, у вас есть свой ответ: этот подход более Pythonic!-)
Что означает «alas»? –
В веб-поиске по 'define: alas', это« выражение горя, жалости или беспокойства ». Я фактически использовал его как выражение ** сожаления ** (за мою ответственность за возможную помощь в неправильном дизайне этого модуля, или, скорее, в том, что он может позволить пропустить неправильный дизайн - слишком поздно, чтобы изменить его сейчас!), Но Надеюсь, что это будет достаточно близко к «горе, жалости или беспокойству» (поскольку английский - это мой третий язык, я никогда не могу быть полностью уверен, правильно ли я его использую, хотя моя жена, родившаяся в Америке, и моя жена редакторы все поддерживают, я использую его лучше, чем большинство носителей языка ... :-). –
Хорошо, английский - это не главное, поэтому я спросил :-) –