2016-08-03 8 views
3

중괄호로 묶은 텍스트의 인스턴스를 중괄호의 내용으로 바꾸고, 빈 중괄호 쌍만 남겨두고 Python 함수를 작성하려고합니다. 예 :Python regex - 대괄호로 묶은 텍스트를 대괄호로 바꿉니다.

foo {} bar {baz}foo {} bar baz이됩니다.

일치하도록 만든 패턴은 {[^{}]+}입니다. 즉, 괄호로 묶은 중괄호 (중첩하는 일치를 방지하기 위해)가 포함되어 있지 않은 텍스트입니다.

확실한 해결책은 내 패턴 re.sub을 사용하는 것입니다, 그리고 내가 \g<0>와 일치하는 텍스트를 참조 할 수 있음을 발견했습니다

>>> re.sub("{[^{}]+}", "A \g<0> B", "foo {} bar {baz}") 
'foo {} bar A {baz} B' 

은 그래서 아무 문제 없습니다. 그러나, 나는 참조 된 텍스트에서 대괄호를 다듬는 방법에 붙어있다. 나는 대체 문자열의 범위를 적용하려고하는 경우 : 범위가 \g<0> 전에 적용됩니다

>>> re.sub("{[^{}]+}", "\g<0>"[1:-1], "foo{}bar{baz}") 
'foo{}barg<0' 

가 일치하는 텍스트로 확인

하고는 특별한을 갖지 않는, 단지 g<0 떠나, \을 선도하고 > 후행 트림 의미. 아무것도 변경하지 않았다, 당연히,

def trimBraces(string): 
    return string[1:-1] 

을하지만 :

는 또한 트리밍을 수행하는 함수를 정의했습니다.

>>> re.sub("{[^{}]+}", trimBraces("\g<0>"), "foo{}bar{baz}") 
'foo{}barg<0' 

무엇이 여기에 있습니까? 미리 감사드립니다.

답변

2

당신은 경기의 일부를 대체 할 캡처 그룹을 사용할 수 있습니다 : 당신은 대체 패턴으로 "\g<0>"[1:-1] 사용하는 경우

>>> re.sub(r"{([^{}]+)}", r"\1", "foo{}bar{baz}") 
'foo{}barbaz' 
>>> re.sub(r"{([^{}]+)}", r"\1", "foo {} bar {baz}") 
'foo {} bar baz' 
+0

간단합니다. 정말 고마워! – halbrd

2

, 당신 만 "\g<0>"문자열 슬라이스가 아닌 실제 값이 역 참조는 다음을 의미합니다.

당신이 당신의 "트리밍"접근 방식을 사용해야하는 경우

, 당신은 re.sub에 일치하는 데이터 객체를 전달해야

re.sub("{[^{}]+}", lambda m: m.group()[1:-1], "foo{}bar{baz}") 
# => foo{}barbaz 

this Python demo를 참조하십시오. m.group()은 패턴에 \g<0>, 즉 전체 일치 값을 나타냅니다.

그러나을 사용하는 경우 capturing groups을 사용하는 것이 더 유기적인 해결책입니다 (alexce's solution 참조).

+1

추가 정보를 가져 주셔서 감사합니다. 어떤 것이 작동 하는지를 아는 것이 아니라 항상 개념을 이해하는 것이 좋습니다. – halbrd

+1

대안이있는보다 복잡한 정규 표현식 패턴과 일치하는 문자열에서 알려진 수의 문자를 잘라 내고 싶을 때이 솔루션을 사용하는 것이 좋습니다 Python're'에서 지사 리셋 기능이 빠져 있음). 말하자면, "..."또는 "... ..."또는'[....]'와 같은 하위 문자열을 매치 할 필요가 있습니다 (그러나'[...] '나'....] ')를 사용하고이 구분 기호 안에있는 문자로 바꿉니다. 파이썬 2.x에서는're.sub'는 역 참조 접근법에 문제가있을 것입니다. 파이썬 3.5는're'(r ' "([^"] *) "| \'([^ \ '] *) \' ', r'\ 1 \ 2 '," 'Something' "))'은 Python 3.5.1에서'Something'을 출력합니다. –

관련 문제