python
  • regex
  • django
  • 2012-11-29 2 views 3 likes 
    3

    내 웹 페이지 (django에서 작성)의 모든 WikiLink 유형을 html 링크로 변환하려고합니다.Python에서 그룹 참조가 올바르지 않습니다. +

    나는이 나에게 문자열을 대체 16 진수 값 다음과 같은 문자열을 반환 다음 식을

    import re 
    expr = r'\s+[A-Z][a-z]+[A-Z][a-z]+\s' 
    repl=r'<a href="/photos/\1">\1</a>' 
    mystr = 'this is a string to Test whether WikiLink will work ProPerly' 
    
    parser=re.compile(expr) 
    parser.sub(repl, mystr) 
    

    을 사용하고 있습니다. 의 re.sub 대한 python help 찾고

    "this is a string to Test whether<a href='/mywiki/\x01>\x01</a>'will work<a href='/mywiki/\x01>\x01</a>'" 
    

    , I는 \ g < 1 \ 변경 1> 그러나 시도한 잘못된 그룹 기준 오차 결과있다. 내가 여기에이 작업

    답변

    15

    문제를 얻을하는 방법을 이해하는 데 도움이 바랍니다

    당신이 expr의 모든 캡처 그룹이 없다는 것입니다.

    일치 항목 중 \1으로 표시하려는 부분은 괄호 안에 넣어야합니다. 예를 들어

    >>> expr = r'\s+([A-Z][a-z]+[A-Z][a-z]+)\s' 
    >>> parser=re.compile(expr) 
    >>> parser.sub(repl, mystr) 
    'this is a string to Test whether<a href="/photos/WikiLink">WikiLink</a>will work ProPerly' 
    

    역 참조 \1는 제 괄호 표현식과 일치하는 부분 일치 내의 1 군을 말한다. 마찬가지로 \2은 그룹 2이고 두 번째 괄호로 묶은 하위 표현식과 일치하는 부분입니다. 그룹 수가 1 개 미만인 경우 \1을 사용하면 일부 정규식 엔진이 오류를 발생시키고 다른 문자는 '\1' 문자 인 ctrl-A를 사용합니다. 파이썬은 후자를 처리하고, ctrl-A의 표준 표현은 '\x01'입니다. 그래서 그렇게 보입니다.

    그룹 0은 전체 일치입니다. 그러나이 경우 공백이 대체의 일부가 아니기 때문에 원하는 경우가 아닙니다.

    g 구문이 필요한 유일한 이유는 단순한 역 참조가 애매한 경우입니다. 서브 123\1456했다 예를 들어, ... 그룹 1456 다음 456, 또는 123 다음 그룹 1, 다음, 또는, 설명에 대한

    Further reading on grouping and backreferences.

    +1

    덕분에 그 123 의미인지 알 수있는 방법이 없습니다. paranthesis()를 추가하면 문제가 해결되었습니다. –

    +0

    위대한 링크를 위해 @ m.buettner에게 감사드립니다. 그가 편집하기 전에 코멘트를 추가했다면 + 1을했을 것입니다. – abarnert

    관련 문제