2012-03-15 4 views
3

은 가정하자 나는regexy 구문이있는 문자열을 일치시키는 방법은 무엇입니까?

x = "spam ?and eggs" 

같은 문자열을 가지고 그리고 그 "?and" 일치하도록 노력하고있어. 현재 다음과 같이하고 있습니다.

>>> print re.findall(re.escape('?and'), x) 
['?and'] 

re.escape의 올바른 사용 사례입니까? 그것은 다른 정규식 구문을 가질 수있는 다른 문자열 리터럴과 함께 작동합니까?

내 유스 케이스는 인수가 pexpect.spawn.expect(pattern)인데, 여기서 입력 패턴은 정규식으로 컴파일 된 문자열 유형이 될 수 있습니다. 어떤 경우에는 내가 찾고있는 것이 정규식처럼 보일지도 모르지만 실제로는 일치시키고 자하는 문자열 리터럴입니다.

답변

2

는 pexpect를 들어, expect_exact()를 사용하는 대신 기대() 정규식 기능을 비활성화하고, 정확히 당신이 그것을 줄 파이썬 문자열과 일치하는 것입니다 수 있습니다. 워드 프로세서

:

expect_exact (자기, pattern_list, 시간 제한 = -1, searchwindowsize = -1)
이) (기대 비슷하지만 일치하는 대신 일반 문자열을 사용 'pattern_list'에 정규 표현식을 컴파일합니다. 'pattern_list'는 일 수 있습니다. 문자열의리스트 또는 다른 시퀀스; 또는 TIMEOUT 및 EOF.

이 호출은 다음 두 가지 이유로 expect()보다 빠를 수 있습니다. 문자열 검색이 RE 일치보다 빠르며 검색을 입력 버퍼의 끝으로 제한 할 수 있습니다.

이 방법은 이기 때문에 일치하려는 정규 표현식 문자 을 이스케이프 걱정하지 않으려 고 할 때 유용합니다.

6

예, 그건 정확히 re.escapethe documentation에 대한 올바른 사용 사례입니다 "당신이에서 정규 표현식 메타 문자를 가질 수있는 임의의 문자 문자열과 일치 할 경우에 유용"— 첫 번째 예에서하지만 나는 그것이 생각이 말한다 조금 더 간단하게 다음 중 하나를 사용하여 물음표를 벗어날 수 있습니다.

re.findall(r'\?and', x)   # \? in a raw string literal 
re.findall('\\?and', x)   # \? in a non-raw string literal, so, \\? 
re.findall('[?]and', x)   # "cheat" by using a character class 
+0

감사합니다. 왜 스스로 그것을 이스케이프 처리 하나의 백 슬래시를 제공하지만,'re.escape'를 사용하면 두 배가됩니까? 이 불일치에는 어떤 의미가 있습니까? re.escape를 사용 하겠지만 실제로는 내가 찾고있는 부분 문자열이 무엇인지 미리 알지 못하기 때문에 (그것은 무엇이든 될 수 있습니다). – wim

+0

@wim : 나는 그것을 엉망으로 만들었고,'r '\?과''raw "문자열 리터럴을 지정했거나''\\? and '' ('\? and'를 포함하는 문자열을 의미합니다. 이는 차례로 물음표에'and'를 더한 정규식을 의미합니다. 're.escape'는 두 개의 백 슬래시를 보여줍니다. 왜냐하면'\?파이썬의 REPL pretty-printing은 파이썬 프로그램에서 사용할 수있는 형태, 즉 '\\? and'로 다시 변환합니다. – ruakh

+0

@wim : 대답을 잘못 고치지 않고 (더 완벽하게) 업데이트했습니다. – ruakh

0

그래, 나에게 맞는 모양. 전체 패턴을 벗어나면 대개 정규 표현식없이 find을 사용해야한다는 좋은 징후입니다.

x.find('?and') 

-1 또는 위치를 제공합니다. 그래서 ...

>>> if x.find('?and') != -1: 
... print "Match!" 
... 
Match! 
+1

예, 보통 'in' 키워드를 사용합니다. '큰 문자열에서 하위 문자열'. 하지만 pexpect 인터페이스로 작업해야합니다. – wim

관련 문제