2014-12-09 1 views
3

대체 정규 표현식이있는 문자열의 특정 부분을 찾으려고합니다. 대안 경로에서 정의 된 스팟을 안전하게 참조하려면 어떻게해야합니까? 나는하려고 생각했다OR 연산자에서 파이썬으로 Regex로 대체 문자열을 잡아낼 수 있습니까?

m=re.match("(A(?P<name>.+)B|C(?P<name>.+)D)", text) 
match=m.group("name") 

그러나 이름을 재정의하는 것과 충돌이있다. 이 정규 표현식은 구성 파일에서 나오고 일치로 이어질 중첩 수준/색인 값을 보장 할 수 없으므로 색인을 사용하여 m.group을 사용하면 문제가 발생합니다.

편집 : 설정에는 텍스트와 일치하는 원본과 별도의 소스가 있습니다. 나는

import re 

for text in ["ABBC", "DEEEF", "GHHI"]: 
    for regex in ["(A(.+)C|D(.+)F)", "G(.+)I"]: 
     m=re.match(regex, text) 
     if m: 
      print(m.group(1)) # should actually match the middle characters, but doesn't work generally 
      break 

미래에 성장할 수있는 가능한 정규식의 수를 달성하고 싶습니다, 그래서 일반적인 솔루션

+0

코드에서 변경할 수 있고 변경할 수없는 항목이 확실하지 않습니다. 이전 답변에서 남긴 주석에서 정규 표현식을 변경할 수없는 것처럼 보입니까? – Jerry

+0

Regex에 필요한 구문을 정의 할 수 있습니다. 하지만 그때에도 여러 개의 독립적 인 Regex *가 있으며 응답에 제안 된 것처럼 거대한 Regex를 안정적으로 생성하는 것이 어렵습니다. – Gerenuk

+0

가능한 해결책은 https://pypi.python.org/pypi/regex/2014.11.14를 사용하는 것입니다. 표준 방법을 놓쳤다면 확실하지 않습니다 ... – Gerenuk

답변

0

가능한 솔루션을 내다보기의 주장을 사용하는 것입니다을 수 있습니다. 정규식 대신 (A(.+)C|D(.+)F)

^(?=A.+C$|D.+F$)[A-Z](.+)[A-Z]으로 바꾼 경우 group(1)은 일반적으로 중간 문자와 일치합니다.

그것은 말합니다 : 당신이 문자열 (^)의 시작 부분에 있고내의 lookahead 어설 션 중 하나가 성공하면 [A-Z](.+)[A-Z] 문자열과 일치합니다.

0

귀하의 예는

  print(filter(None, m.groups())[0]) 

(단순히 경기가 포함 된 그룹을 복용)에

  print(m.group(1)) 

을 변경하여 작동하도록 만들 수 있습니다.

관련 문제