2013-10-08 2 views
0

내가 뭘 하려는지 변수 (변수의 내용)와 파이썬 정규식을 사용하여 문자열을 대체하는 것입니다. 일치하는 표현식을 유지해야하기 때문에 \1\3 그룹 일치 인수를 사용합니다.변수를 사용하여 표현식을 파이썬 정규 표현식

내 정규식/서브는 다음과 같습니다 일어나고있는 것으로 보인다 무엇

pattern = "\1" + id + "\3" \b 
out = re.sub(r'(;11=)(\w+)(;)',r'%s' % pattern, line) 

\1하고 \3 출력에 추가되지 않습니다.

또한 대체 표현식이 시도했다 :

r'\1%s\3'%orderid 

하지만 비슷한 결과를 얻었다. 문제를 해결할 수있는 방법에 대한 제안 사항이 있으십니까?

+1

왜 '\ 1'과'\ 3'에 일치 항목을 저장해야합니까? 그것들은 항상 같은 값을 가지고 있습니다. 're.sub (r '(; ​​11 =) (\ w +) (;)', "; 11 ="+ id + ";"행)', 11 = \ + +; '; "; 11 ="+ id + ";", 줄)'(어쨌든'\ w +'를 사용하는 것 같지 않습니다. – Jerry

+0

나는 다른 사람을 시험해 보았습니다. 그러나 이것은 결국 나를 위해 일한 것입니다. Jerry에게 감사드립니다. 나는 그것을 보지 못했다고 나는 믿을 수 없다. – Pradyot

답변

1

당신은 백 슬래시 원시 문자열을 사용하거나 두 배로해야합니다 리터럴 일반 파이썬 문자열에서

pattern = r"\1" + id + r"\3" 

또는

pattern = "\\1" + id + r"\\3" 

\number는 대신 진수 문자 코드로 해석됩니다 :

>>> '\1' 
'\x01' 

백 슬래시에는 특별한 의미가 없습니다. i n은 문자 그대로의 원시 문자열 :

>>> r'\1' 
'\\1' 

원시 문자열 리터럴 단지 표기이 아닌 유형입니다. r''''은 모두 문자열을 생성하며 백 슬래시를 해석하는 방법은 이고 소스 코드는입니다.

그룹 1과 그룹 3은 문자가 텍스트와 일치하기 때문에 대체 문자를 사용할 필요가 없습니다. 단순히 사용

out = re.sub(r';11=\w+;', ';11=%s;' % id, line) 

또는 사용 룩 뒤에 내다과 리터럴을 반복 할 필요없이 지내다가 :

out = re.sub(r'(?<=;11=)\w+(?=;)', id, line) 

데모 :이려고하고 있지 않다

>>> import re 
>>> line = 'foobar;11=spam;hameggs' 
>>> id = 'monty' 
>>> re.sub(r';11=\w+;', ';11=%s;' % id, line) 
'foobar;11=monty;hameggs' 
>>> re.sub(r'(?<=;11=)\w+(?=;)', id, line) 
'foobar;11=monty;hameggs' 
0

가 작동 :

pattern = "\1" + id + "\3" 
# ... 
r'%s' % pattern 

r 접두어는 리터럴 해석 방법에만 영향을줍니다. 따라서 r'%s'%s이 원시로 해석된다는 것을 의미하지만 이는 없이 해석되는 것과 같은 의미입니다. 한편 pattern에는 원시가 아닌 리터럴 "\1""\3"이 있으므로 %에 도달하기 전에 이미 컨트롤 A와 컨트롤 C가 있습니다.

당신이 원하는 것은 그러나

pattern = r"\1" + id + r"\3" 
# ... 
'%s' % pattern 

, 당신이 정말로 전혀 % 서식을 필요로하지 않는다; 그냥 pattern을 사용하면 똑같은 것을 얻을 수 있습니다.