"Канонический" перевод Python вашего фрагмента ...:
import re
myre = re.compile(r'(.*?):([^-]*)-(.*)')
for line in lines:
mo = myre.search(line)
field_1, field_2, field_3 = mo.groups()
Импорт re
является обязательным (импорт обычно выполняется в верхней части модуля, но это не обязательно).Предварительная компиляция RE является необязательной (если вместо этого вы используете функцию re.search
, она скомпилирует ваш шаблон на лету), но рекомендуется (чтобы вы не полагались на кэш модуля скомпилированных объектов RE для вашей производительности, а также дляиметь объект RE и вызывать его методы, что более распространено в Python).
Вы можете использовать либо метод match
(который всегда пытается найти соответствие с самого начала, независимо от того, начинается ли ваш шаблон с '^'
) или метод search
(который пытается сопоставить где угодно);с вашим заданным шаблоном они должны быть эквивалентны (но я не уверен на 100%).
Метод .groups()
возвращает все подходящие группы, чтобы вы могли назначить их все одним глотком (используя список в Python,Точно так же, как использование массива в Perl, вероятно, будет более нормальным, но, поскольку вы решили использовать скаляры в Perl, вы можете сделать эквивалент и в Python.)сопоставить RE, что хорошо, если вы знаете, что все они совпадают (я не уверен, каково поведение вашего Perl, но я думаю, что вместо этого он будет «повторно использовать» значения предыдущей совпадающей строки, что является своеобразным ... если только сноваВы знаете, все линии совпадают ;-).Если вы хотите просто пропустить несовпадающие строки, измените последний оператор на следующие два:
if mo:
field_1, field_2, field_3 = mo.groups()