2012-04-27 4 views
2

Может ли кто-нибудь мне помочь с переводом этого регулярного выражения на Python re?sed regex to Python re

sed -e "s/^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) /\1 \2 \4 \3 /"

Как я понял, это заменяет один текст на другой. Как я могу создать что-то вроде этого с помощью модуля re? Благодаря!

например. Fri Mar 21 07:16:51 2008 -0600 будет преобразован в Mar 21 2008 07:16:51 -0600.

source = 'Fri Mar 21 07:16:51 2008 -0600' 
pattern = re.compile('^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) ') 
result = re.sub('\\1 \\2 \\4 \\3 ', source) 
+0

@nightcracker: Я понимаю, что я должен использовать '' re.sub'', но я не могу себе представить, что означает '' \ 1 \ 2 \ 4 \ 3''. – ghostmansd

+0

нет, что у вас __tried__? – orlp

+0

'\ 1 \ 2 \ 4 \ 3' могут быть сопоставлены с использованием' \\ 1 \\ 2 \\ 4 \\ 3', и кроме этого ваше регулярное выражение * должно * скрыто прямо к модулю re-Python. – covertCoder

ответ

2

Отбросьте обратный слэш о скобках в шаблоне тоже, как и в:

pattern = re.compile('^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ') 

так, как вы имели его, вы убегали в скобках, которые должны быть признаны в качестве групп, так что вы на самом деле захватить четыре группы, соответствующие \ 1 ... \ 4

+0

Да, это работает! Но почему? Мне нужно отображать эти символы только в '' sed''? – ghostmansd

+0

Я не уверен, почему он работает в 'sed', но в python вы избегаете специальных символов только тогда, когда вы хотите их сопоставить, а не использовать в качестве специальных символов регулярного выражения: P. Это самый чистый ответ, который вы могли бы получить, поэтому я удалил свою. – covertCoder

+0

Обратные косые черты в команде sed ускользают от него для командного процессора (bash/sh/whatever). –

1

Попробуйте это вариант один вкладыш:

import re 
re.sub(r'^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ', '\g<1> \g<2> \g<3> \g<4>', source) 

Или это, используя скомпилированный шаблон - более эффективной, если же регулярное выражение должно быть повторно использовано:

import re 
pattern = re.compile(r'^[^ ]* ([^ ]*) ([0-9]*) ([0-9:]*) ([0-9]*) ') 
pattern.sub('\g<1> \g<2> \g<3> \g<4>', source) 
+0

Это не работает. – ghostmansd

+1

После редактирования этот тоже работает. – ghostmansd

+0

@ghostmansd, пожалуйста, попробуйте еще раз, я обновил свой ответ –