Каков наиболее эффективный способ повторного использования регулярных выражений в цикле Python? - PullRequest
2 голосов
/ 16 июля 2010

Когда вы выполняете итерации по сотням строк в файле, каков наиболее (и наименее) эффективный способ запуска регулярных выражений в Python?

В частности, является ли следующая неправильная форма?

for line in file:
  data = re.search('(\d+\.\d+)\|(-\d+\.\d+)\|(.*?)\|(.*?)\|(\d+:\d+\s+\w+)\sTO\s(.*?)',line)
  one = data.group(1)
  two = data.group(2)
  three = data.group(3)
  four = data.group(4)
  five = data.group(5)
  six = data.group(6)
  # do the magic...

Ответы [ 3 ]

6 голосов
/ 16 июля 2010

Если вы просто используете это регулярное выражение снова и снова, вам не нужно его компилировать напрямую. http://docs.python.org/release/2.6.5/library/re.html#re.compile

Кэшированные версии самых последних шаблонов, переданных в re.match (), re.search () или re.compile (), кэшируются, поэтому программы, использующие только несколько регулярных выражений за раз, не должны беспокоиться составление регулярных выражений.

Однако я бы очень рекомендовал не выполнять нижеприведенные задания так, как вы. Попробуйте что-то вроде этого:

for line in file:
    data = re.search('(\d+\.\d+)\|(-\d+\.\d+)\|(.*?)\|(.*?)\|(\d+:\d+\s+\w+)\sTO\s(.*?)',line)
    groups = data.groups()
    # do the magic...

MatchObject.groups() возвращает кортеж всех групп в матче, причем группам, которые не участвуют в матче, присваивается значение, переданное groups() (по умолчанию это значение равно None).

3 голосов
/ 16 июля 2010

Сохраните регулярное выражение перед циклом.

rx = re.compile( '(\d+\.\d+)\|(-\d+\.\d+)\|(.*?)\|(.*?)\|(\d+:\d+\s+\w+)\sTO\s(.*?)' )
for line in file:
  data = re.search(rx,line)
  one = data.group(1)
  two = data.group(2)
  three = data.group(3)
  four = data.group(4)
  five = data.group(5)
  six = data.group(6)
1 голос
/ 16 июля 2010

Если скорость не является проблемой, тогда вы можете просто захотеть использовать то, что вам удобно читать и что работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...