2011-11-06 5 views
2

정규 표현식이 조금 붙어 있습니다. 나는 형식파이썬 정규 표현식 - 중괄호 사이의 문자를 제외한 모든 문자를 대체하십시오.

{% 'ello %} wor'ld {% te'st %} 

에 문자열을하고 난 {% ... %} 태그 사이에하지 만 아포스트로피를 탈출하려는, 그래서 예상되는 출력 난 그냥 그들 모두를 교체 할 수 있습니다 알고

{% 'ello %} wor"ld {% te'st %} 

입니다 문자열을 replace 함수를 사용하지만, 나는 그 외부 중괄호와 일치하는 정규식을 사용하는 방법에 관해서는 손실에있어

+0

당신의 수 { % 얇은 % nest? – tchrist

답변

5

이것은 아마도 정규식으로 할 수 있지만, 복잡한 것일 수 있습니다.

>>> instr = "{% 'ello %} wor&quote;ld {% te'st %}" 
>>> re.sub(r'\'(?=(.(?!%}))*({%|$))', r'&quote;', instr) 
"{% 'ello %} wor&quote;ld {% te'st %}" 

그것은 하나 찾을 앞서 긍정적 인 모양을 사용

def escape(s): 
    isIn = False 
    ret = [] 
    for i in range(len(s)): 
     if not isIn and s[i]=="'": ret += ["""] 
     else: ret += s[i:i+1] 

     if isIn and s[i:i+2]=="%}": isIn = False 
     if not isIn and s[i:i+2]=="{%": isIn = True 

    return "".join(ret) 
+0

+1 : 정규식은 잘못된 도구입니다. 당신은 당신의 기능을 고칠 필요가있다. 태그 안의 아포스트로피 (*)는 이스케이프 처리되어야합니다. 그렇다면 isIn과 s [i] == " '"... "는''isIn ...''이어야합니다. – Blair

+0

좋은 지적, 덕분에 –

+2

누구든지 downvoted, 당신은 이유를 설명해 주시기 바랍니다 수 있습니다. –

3

그냥 재미를 위해,이 정규식 함께 할 수있는 방법은 다음과 같습니다 당신은 그냥 직접 할 경우 작성하고 읽기 쉽게 {% 또는 문자열의 끝, 그리고 긍정적 인 lookahead 안의 부정적인 lookahead는 기대에 어떤 %}도 포함되지 않도록합니다.

2

는 정규 표현식을 사용하려는 경우, 당신이 생각처럼 할 수있는 : 에산의 예견 솔루션과 비교

>>> s = """'{% 'ello %} wor'ld {% te'st %}'""" 
>>> segments = re.split('(\{%.*?%\})', s) 
>>> for i in range(0, len(segments), 2): 
    segments[i] = segments[i].replace('\'', '"') 

>>> ''.join(segments) 
""{% 'ello %} wor"ld {% te'st %}"" 

, 이것은 당신이 교체 또는 분석의 모든 종류의를 실행할 수있는 이점이있다 다른 정규 표현식을 재실행 할 필요가없는 세그먼트. 따라서 다른 캐릭터를 교체하기로 결정한 경우 루프에서 쉽게 수행 할 수 있습니다.

0

bcloughlan, 언급되지 않은 간단한 해결책이 있었기 때문에이 질문을 부활 시켰습니다. (일반적인 질문에 대한 how to exclude patterns in regex에 대한 몇 가지 조사를하는 동안 귀하의 질문에 발견.)

여기에 간단한 정규식입니다 : 교대의

{%.*?%}|(\') 

왼쪽이 완료 {% ... %} 태그를 일치합니다. 우리는이 경기를 무시할 것입니다. 오른쪽은 그룹 1의 아포스트로피와 일치하고 캡처합니다. 왼쪽에있는 표현과 일치하지 않아 올바른 아포스트로피임을 알 수 있습니다.

이 프로그램은 정규 표현식을 사용합니다 (online demo의 결과 참조)하는 방법을 보여줍니다 참조

    import re 
    subject = "{% 'ello %} wor'ld {% te'st %}" 
    regex = re.compile(r'{%.*?%}|(\')') 
    def myreplacement(m): 
        if m.group(1): 
         return """ 
        else: 
         return m.group(0) 
    replaced = regex.sub(myreplacement, subject) 
    print(replaced) 
    

  1. How to match pattern except in situations s1, s2, s3
  2. How to match a pattern unless...
관련 문제