2012-04-27 2 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 -0600Mar 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 모듈로 바꿔야합니다. – covertCoder

답변

2

같이 너무 당신의 패턴에서 괄호에 백 슬래시를 삭제 :

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

당신이 그것을 가지고하는 방법을, 당신은 그룹으로 인식해야하는 괄호를 탈출했다 있도록 실제로 4

+0

그래, 그거야! 하지만 왜? 나는이 기호들을''sed''에서만 스크린 할 필요가 있습니까? – ghostmansd

+0

''sed'에서 왜 작동하는지 모르겠지만 파이썬에서는 특수 문자를 정규식 특수 문자로 사용하지 않고 일치 시키려고 할 때만 이스케이프 처리합니다 : P. 이것은 아마도 당신이 얻을 수있는 가장 깨끗한 답변입니다. 그래서 나는 내 것을 삭제했습니다. – covertCoder

+0

sed 명령의 백 슬래시가 명령 프로세서 (bash/sh/whatever)에서 이스케이프 처리됩니다. –

1

\이 시도 ...는 \ 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 다시 시도하십시오, 내 대답을 업데이트했습니다 –