2013-04-15 5 views
1
unc = r'\\foo\bar' 
string1 = r'\\foo\bar' 
string2 = r'\\\\foo\\bar' 

if unc == string1: 
    print "I wish to make a complaint" 

if re.match(string1, unc): 
    print "Ello miss" 

if re.match(string2, unc): 
    print "Sorry I have a cold" 

출력은 다음과 같습니다파이썬 백 슬래시 정규식 재미

I wish to make a complaint 
Sorry I have a cold 

은 re.match 조작 리터럴 문자열을 재-탈출 그래서 "여보세요가 그리워"일이 결코 보인다. 내가 처음에 리터럴로 문자열을 설정 백 슬래시를 다시 탈출해야하는 이유

는 사람이 설명 할 수 있습니까?

나는 구성 파일에 UNC 경로의 목록을 유지하려면 내가 그 문자열을 탈출해야하지 않으려는 것입니다. 비교기가 작동하는 동안 정규식 옵션을 사용할 수 있으면 유용합니다.

+0

'.format()'호출은 중복됩니다. 'string1'과'string2'는 * 이미 * 문자열입니다. –

+0

심지어 "'선호 r'my_regex_wild_pattern'''을 통해" "my_regex_gentle_pattern" ""': 내가 할 수있는 유일한 나쁜 깜짝 마지막 문자에 있습니다. –

+0

@StephaneRolland : 핵심은 파이썬 문자열 리터럴 *과 *를 정규 표현식으로 지정하기위한 이스케이프 시퀀스가 ​​있다는 것입니다. 'r ''원시 문자열 리터럴을 사용하면 파이썬 이스케이프 시퀀스를 비활성화하여 정규 표현식 메타 문자에 집중할 수 있습니다. –

답변

3

\ 문자는 정규 표현식에서 특수 문자이며, 문자 그대로 수 이스케이프해야합니다. 따라서 문자열 \\foo\bar과 일치 시키려면 발견 한대로 정규 표현식 \\\\foo\\bar이 필요합니다. 큰 표현식에 포함시키기 위해 re.escape 함수를 사용하여 그러한 정규 표현식을 만들 수 있습니다.

>>> re.escape(r'\\foo\bar') 
'\\\\\\\\foo\\\\bar'   # ouch 
+0

re.match (re.escape (string1), unc) - 우수합니다. 감사합니다. – jayuu

+0

@jayuu 그건'unc.startswith (string1)'과 동일합니다. 're.escape'의 의도 된 사용법은'my_re = '^ From :. * % s'% re.match (name)'처럼 상수 문자열과 일치하는 정규식을 더 큰 표현식에 삽입하는 것입니다. – user4815162342

+0

OK - re.match (name) 대신 re.escape (name)을 의미 했습니까? – jayuu

2

정규식 패턴에서 백 슬래시는 의 의미를 가지며 명시 적으로 이스케이프해야합니다.

등으로

, \\ 의미 : 한 문자 \ 문자와 일치합니다.

리터럴 텍스트를 re.match()으로 전달하려면 먼저 re.escape()을 사용하여 가능한 모든 메타 문자를 이스케이프 처리해야합니다.

+0

감사합니다 귀하의 회신 Martijn 주셔서 감사합니다. 나는 첫 번째 답변을 처음으로 받아 들였고 큰 정규 표현식 내에서 이스케이프를 사용하는 것에 대한 유용한 문맥 정보도 포함시켰다. – jayuu