2016-07-18 7 views
0

're'패키지를 사용하여 파이썬에서 다음 문제를 해결하기 위해 마술 구문을 파악하는 데 단지 한 시간을 보냈습니다. 나는 잠시 주위 해킹,하지만 도전을 제시하고 싶습니다 :캡쳐 괄호와 비 탐욕적인 일치 제한이있는 정규식

은 다음 문자열이 우리의 테스트를 나타냅니다

*Structure song <!-- See Project:Project_Songs --> 
*Structure song | 
*Structure song title | 

목적은 '노래', '노래'를 추출하는 것입니다, 그리고 '노래 제목'을 하나의 정규식과 함께 사용하십시오.

내 시도 :

r'\*Structure ([^\|]*)(?:<)?' 

나는 내가 지금까지 시도한 다양한 조합은하지 않습니다. 내 회피 방법은 앰퍼샌드 '&'을 캡처 괄호의 제외 집합에 추가합니다. 그러나 추출 된 문자열에 '&'을 포함 할 수 없다고 가정하고 싶지는 않습니다.

+0

대신 경기 후행 경계를 어떻게 생각합니까? –

+0

'제목'패턴과 생략하고 싶은 것의 현저한 차이점은 무엇입니까? –

+1

복잡한 정규 표현식을 작성하는 것이 아니라 단순히 [unescape] (https://docs.python.org/3/library/html.html#html.unescape)하지 않습니까? – jonrsharpe

답변

2

내가 드미트리의와 유사한 패턴을 사용 싶지만, 더 선형 하나

\*Structure\s(.*?)(?=\s(?:<|\|)) 

regex demo를 참조하십시오.

설명 :

  • \*Structure - 리터럴 문자열 *Structure
  • \s - 공백은 (만 필요한 경우 정상적인 공백이나 탭, 또는 단순한 공간과 일치에만 [ \t]로 교체 공백에 매치)
  • (.*?) - 첫 번째까지 가능한 한 적은 뉴 라인이 아닌 0 개 이상의 문자를 캡처하는 그룹 1 ...
  • (?=\s(?:<|\|)) - (필요한 양 룩어)
    • \s은 - 공백이 뒤를 어느 ...
      • < - 문자열 <
      • | - 또는 ...
      • \| - 리터럴 파이프 기호.

더 빠른 동의어의 대안 정규식 그것은이다 this demo

를 참조

\*Structure\s(\S*(?:\s(?!<|\|)\S*)*) 

처럼 보일 것입니다 (풀다 - 더 - 루프 원리에 기초로) 동일한 정규 표현식이지만 가장 선형적인 방식으로 작성됩니다.

+0

180 steps (Regex 1) 대 98 steps (Regex 2). 프로덕션에서 Regex 2를 사용합니다. –

+0

예,이게 내가 원하는 것입니다. 고정되지 않았기 때문에 가변적 인 수의 공백 만 허용하도록 업데이트되었습니다. –

+0

글쎄, 항상 최소한 하나의 공백이 있다면,'+ * 구조체 \ s + (. *?) (? = \ s + (? : < | \ |))'또는 '\ * 구조 \ s + (\ S + (? : \ s + (?! < | \ |) \ S +) *)'. 또한 다중 행 입력이있는 경우에 대비하여'\ s'가 아닌 일반 공간을 사용해야합니다. –

1

나는 욕심이없는 "anything"다음에 "& lt;"을 사용하는 것이 좋습니다. 또는 내다로 표현 파이프 문자 :

\*Structure (.*?(?= &lt;)|.*?(?= \|)) 

데모 : https://regex101.com/r/rT3oV5/2

+0

고마워요.하지만 원하는 문자열 뒤에 "| <"이있는 경우에도 문제가 발생합니다. –