2016-07-08 5 views
0

검색 패턴을 찾고 있습니다. 다른 패턴 안에 따라야하는 특정 패턴이 있습니다. 여하튼이 패턴이있는 경우 <> 문자 다음에 \ 문자를 이스케이프해야합니다. 문자가 패턴에 없으면 문자가 나타날 수 있습니다.regex : 문자가 있어야하고 뒤에 다른 이스케이프 문자가옵니다.

내가 이런 식으로 일을 시도 : input_string = '<First tag:<Second tag:hello>tag ends>' re.findall('(?<!\\)<.*?:.*?(?<!\\)>',input_string)

예상 출력 : 내가 가진 무엇 ['<Second tag:hello>']

은 다음과 같습니다 (?<!\\)<[^(?<!\\)<.*:]+:[^(?<!\\)<.*:]+?(?<!\\)>

이것은 위의 예를 전달합니다 ['<First tag:<Second tag:hello>']

내가이 패턴과 노력을 이 입력에 대해서는 input_str = '<First tag:\<Second tag:hello>tag ends> <First tag:<Second tag:hello\>tag ends> <First tag:\<Second tag:hello\>tag ends>' 이 실패합니다.

이 예상 출력 : ['<First tag:\<Second tag:hello>','<Second tag:hello\>tag ends>','<First tag:\<Second tag:hello\>tag ends>']

+1

의 예로서. 그것은 작동하지 않습니다. –

+0

그래서 가장 안쪽으로 이스케이프 처리되지 않은 '<' to '>'을 원하십니까? 그건 정규식으로 할 수 있어야합니다. – TemporalWolf

+0

@TemporalWolf 그렇습니다, 정확히 ..':'with '<' and '>' – Sohn

답변

0

(?<!\\)<(?:[^<>]|\\<|\\>)+:(?:[^<>]|\\<|\\>)*[^\\]>

을 제공합니다 :

고장 :

(?<!\\) 부정적인 모습 두 번째 예를 들어

$1 - <First tag:\<Second tag:hello> 
$1 - <Second tag:hello\>tag ends> 
$1 - <First tag:\<Second tag:hello\>tag ends> 

뒤에 -> 앞에 \으로 시작할 수 없습니다. 나는 그룹 물건 싶지만 추가 그룹

[^<>] Any character that is not an angle bracket 

| or 

\\< An escaped left bracket 

| or 

\\> An escaped right bracket 

)+ 그룹을 닫습니다 싶지 않아 ... :

<

비 캡처 그룹을 시작 (?: 개방 각도 브래킷

로 시작 그것을 한 번 이상 복제하십시오.

: 세미콜론

(?:[^<>]|\\<|\\>)* 같은 각각 캡처 기, 0 회 이상.

[^\\]> 마지막으로 \과 그 뒤에 오른쪽 꺾쇠 괄호를 제외하고 끝나야합니다. \\은 이스케이프해야하기 때문에 사용됩니다.

regex101 링크를 테스트하려는 경우

이 업데이트 된 정규식 받아 들일 것입니다 : <a:a> 무한 중첩 아무것도를 구문 분석하는 정규식을 사용하지 마십시오 가장 작은 유효 일치

+0

: 여전히 여기에''과'/ '과 같은 원치 않는 입력을 받아들입니다.이 형식을''형식으로하고 싶지만 중첩되지는 않습니다. – Sohn

+0

요청에 따라 수정되었습니다. – TemporalWolf

+0

노력해 주셔서 감사합니다. 유감스럽게도 .. 혼란 스러울 수도 있습니다 ..''여기에 'Some tag'와'Another tag '는 패턴 안에'<' and '> '을 포함 할 수 있습니다. ''이 2 번째로 받아 들여집니다.'<'는 패턴이 아닙니다. – Sohn