2009-08-08 5 views
4

나는이 펄 스 니펫을 스크립트에서 파이썬으로 번역하고있다. 나는 "s!" 연산자는하고있다; 어떤 종류의 정규 표현식 대체. 불행하게도 Google이나 Stackoverflow를 검색하는 연산자는 많은 도움이되지 않습니다."s!" Perl의 연산자는 무엇입니까?

$var =~ s!<foo>.+?</foo>!!; 
$var =~ s!;!/!g; 

각 행은 무엇을하고 있습니까? 이 연산자를 다시 실행할 경우를 대비해서 알고 싶습니다.

파이썬의 동등한 구문은 무엇입니까?

답변

15

s!foo!bar!은 foo와 bar에 이스케이프 처리되지 않은 슬래시가 포함될 수 있다는 점을 제외하고는 더 일반적인 s/foo/bar/과 같습니다. 그것이 무엇인지, 그것은 정규 표현식 foo의 첫 번째 발생을 막대로 바꿉니다. g가있는 버전은 모든 발생을 대체합니다.

+1

많은 언어에서 Perl이 차용됩니다. 이것을 sed에게서 빌 렸습니다. – runrig

2

은 대체 연산자입니다.

s/foo/bar/ 

,하지만이 필요하지 않습니다 : : 일반적으로이 구분은 '/'사용하는 다른 문자의 번호 대신 구분 기호로 사용할 수 있습니다. 이 경우 '!' 는 분리 문자로 사용되어 아마도 대체 될 실제 텍스트에서 '/'문자를 이스케이프해야 할 필요성을 피할 수 있습니다.

구체적인 경우 첫 번째 줄은 '. +?'와 일치하는 텍스트를 제거합니다. 즉 콘텐츠가 있거나없는 'foo'태그를 제거합니다.

두 번째 줄은 모두 ';' '/'문자가있는 문자 (전체적으로 모든 문자).

f=re.sub(searchregx,replacement_str,line) 
+0

"... 콘텐츠가 있거나없는 'foo'태그를 제거합니다." 아니요 - 적어도 하나의 * 문자를 감싸는 'foo'태그를 제거합니다. +1하지만 실제로는 파이썬 코드를 보여줍니다. – pilcrow

+0

@pilcrow : 흠, 설명해 주셔서 고마워요. '?' 여기에 불필요한 것 같습니다. 나는 '. +?'을 추측했다. '(. +)'와 같이 작동합니다. 그러나 그렇지 않습니다. –

+0

'. +?' "하나 이상 있지만 가능한 한 적게 일치하는 동안"을 의미합니다. 가능한 한 많이 일치하는 '. +'와 반대입니다. – sepp2k

13

그것은 $var =~ s/// 같은 정확히 뭐하는거야 :

는 파이썬 해당하는 코드는 re 모듈을 사용합니다. 즉, 검색을 수행하고 $var 변수 내에서 대체합니다.

Perl에서 s 다음에 구분 문자를 정의 할 수 있습니다. 왜 ? 예를 들어 '/'와 일치하는 경우 다른 구분 문자 (이 경우 '!')를 지정할 수 있으며 일치하는 문자를 이스케이프하거나 역 인용 할 필요가 없습니다. 그렇지 않으면 결국 (말하기)

s/;/\//g; 

으로 조금 더 혼란스러워 할 것입니다.

Perlre에 대한 자세한 정보가 있습니다.

0

그리고 파이썬은 re 모듈을 사용하는 것과 같습니다.

3

s는 대체 연산자입니다. 일반적으로 s/foo/bar/의 형식이지만, 분리 문자를 과 같은 다른 문자로 바꿀 수 있습니다!. 다른 분리 기호 문자를 사용하면 경로 구분 기호를 벗어날 필요가 없으므로 경로와 같은 항목을 사용하는 것이 훨씬 쉬워집니다.

자세한 내용은 manual page을 참조하십시오.

파이썬에 대한 비슷한 기능을 re-module에서 찾을 수 있습니다.

10

Perl에서는 많은 구문에 대해 구분 기호를 선택할 수 있습니다. 이것은 당신이 모든 구분 기호는 동일한 효과를 가지고,하지만 볼 수 있듯이 쉽게

$str =~ s{/foo/bar/baz/}{/quux/}; 

처럼 표현식에서 무슨 일이 일어나고 있는지 볼 수 있습니다. 브라켓 문자 (<>, [], {}())는 시작과 끝 문자에 서로 다른 문자를 사용합니다. 그리고 ?은 정규 표현식의 구분 기호로 사용될 때 reset() 연산자에 대한 호출간에 정규 표현식을 한 번만 일치시킵니다.

perldoc perlop (특히 m/PATTERN/msixpogc, ?PATTERN?s/PATTERN/REPLACEMENT/msixpogce 섹션 참조)을 읽는 것이 도움이 될 수 있습니다.

2

s!은 '적절한's/// 연산자에 대한 구문 식 설탕입니다. 기본적으로 '/'대신 원하는 구분 기호로 대체 할 수 있습니다.

각 행의 작업과 관련하여 첫 번째 행은 정규 표현식 <foo>.+?</foo>의 일치를 일치시키고 전체 로트를 아무것도 대체하지 않습니다. 두 번째는 정규식 ;과 일치하고 /으로 바꿉니다.

s///은 대체 연산자입니다. 정규식과 대체 문자열을 사용합니다.

s/regex/replace string/; 

가 지원 (모든?) (운전자의 단부에 추가하여)이 일반적인 방법으로 사용되는 통상의 정규식 스위치 대부분.

관련 문제