2017-12-29 6 views
2

이 질문은 아마도 부정적인 눈살을 찌푸 리지 않는 해결책을 가지고 있기 때문에 가변 길이 찾기와 관련이 없습니다.정규 표현식 집합을 나타내는 패턴 일치하기

Python3에서 정규 표현식으로 달성 할 수있는 한계에 해당하는 패턴을 찾으려하지만, 여전히 시도하고 싶습니다. 실제로 구문 분석 도구를 사용하지 않으려 고합니다.

내가 원하는 것은 정규 표현식 세트를 나타내는 패턴입니다. 그래서 다음과 일치합니다.

[abc] 
[1-9\n\t] 
[ \t\]] 
[\\\]] 
[[\\\\\\\]] 

대괄호가 [[]] 예에 의해, 중첩 될 수 없습니다, 우리는 [[]을 일치합니다.

\]은 이스케이프 처리 된 대괄호를 나타내므로 무시해야합니다. 그러나 \\]과 같은 패턴을 받아 들여야합니다. 다음은 일치하지 않습니다.

[\] 
[\\\] 
[abc\\\] 

규칙은 \ 홀수만큼 선행되지 않는 제 ][에서 매치 끝나게.

고정 길이가 있어야하기 때문에 부정적 인 것 같습니다. 작동하지 않습니다.

편집 : 당신은 사용할 수 위의 간단한 버전을

r'\[(?:\\.|[^]\\])*\]' 
+0

감사합니다.이 특정 문제에이 문제를 적용하려고합니다. –

+0

시도한 패턴은 무엇입니까? –

+0

작동하는 것처럼 보이는 패턴을 발견했습니다. 아래 답변을 참조하십시오. –

답변

1

을 Rawing에 의해

re.compile(r'\[[^]\\]*(?:\\.[^]\\]*)*]', re.DOTALL) 
: 흥미로운 솔루션을 Wiktor Stribiżew

re.compile(r'\[[^]\\]*(?:\\.[^]\\]*)*\]') 

편집에 의해 주어졌다

regex demo을 참조하십시오.

상세

  • \[ - 시퀀스와 일치하는 비 - 포착 기의 시작합니다 [ CHAR
  • [^]\\]* - - ]\
  • (?:보다 0 이상의 문자 기타 :
    • - \
  • )* 0 이상의 문자 ] 이외 - - \ 숯불
  • [^]\\]* 모든 문자에 따라 비 - 포착 기
  • ] 안에 패턴 제로 이상의 반복을 - ] char.

정규식은 unroll-the-loop principle을 따릅니다. 입력에 따라 무제한 계량 된 대체 그룹을 기반으로하는 펼쳐지지 않은 버전 (r'\[(?:\\.|[^]\\])*]')보다 10 배 이상 빠른 속도로 작동하므로 많은 양의 후행 추적 단계가 발생합니다.

초기 [ 앞에 백 슬래시가 있으면 위의 정규 표현식이 실패 할 수 있습니다. 이러한 경우에, 당신은

r'(?<!\\)(?:\\{2})*(\[[^]\\]*(?:\\.[^]\\]*)*])' 

이 정규식 데모

가장 큰 차이점은 여기 (?<!\\)(?:\\{2})*, 현재 위치가 \ 문자 앞에 오는 경우 경기를 실패 (?<!\\) 부정적인 lookbehind 및 (?:\\{2})*이다를 참조해야합니다 두 개의 리터럴 백 슬래시를 0 회 이상 반복합니다. 나머지 패턴은 캡처 링 괄호로 묶여 있으며, 일치하는 항목이 발견되면 올바른 값을 얻으려면 match.group(1)에 액세스하면됩니다.