2013-06-17 5 views
1

이름 개체과 일치해야합니다 (pdf 파일 사양 참조). 그러나 이름에는 특수자를 지정하는 16 진수 (#가 앞에 붙음)가 포함될 수 있습니다. 이 경기를 해당 문자로 번역하고 싶습니다. 일치 문자열을 다시 구문 분석하지 않고도이를 수행 할 수있는 영리한 방법이 있습니까?regex match groups 번역하기

import re 

Name = re.compile(r''' 
    (/          # Literal "/" 
     (?:         # 
      (?:\#[A-Fa-f0-9]{2})    # Hex numbers 
      |         # 
      [^\x00-\x20 \x23 \x2f \x7e-\xff] # Other 
     )+         # 
    )           # 
    ''', re.VERBOSE) 

# some examples 

names = """ 
    The following are examples of valid literal names: 

    Raw string      Translation 

    1. /Adobe#20Green   -> "Adobe Green" 
    2. /PANTONE#205757#20CV  -> "PANTONE 5757 CV" 
    3. /paired#28#29parentheses -> "paired()parentheses" 
    4. /The_Key_of_F#23_Minor -> "The_Key_of_F#_Minor" 
    5. /A#42      -> "AB" 
    6. /Name1 
    7. /ASomewhatLongerName 
    8. /A;Name_With-Various***Characters? 
    9. /1.2 
    10. /$$ 
    11. /@pattern 
    12. /.notdef 
    """ 
+0

입력 문자열에서 이것을 바꾸시겠습니까? 아니면 일치하는 이름을 이스케이프 처리되지 않은 이스케이프 시퀀스와 함께 나열 하시겠습니까? –

+0

're.sub '를 사용할 수 있습니까? –

+0

@MartijnPieters - 이스케이프 시퀀스와 이스케이프 시퀀스가 ​​일치하지 않는 목록을 나열하십시오. – root

답변

1

:

import re 
from functools import partial 

def _hexrepl(match): 
    return chr(int(match.group(1), 16)) 
unescape = partial(re.compile(r'#([0-9A-F]{2})').sub, _hexrepl) 

def pdfnames(inputtext): 
    for match in Name.finditer(inputtext): 
     yield unescape(match.group(0)) 

데모 :

>>> for name in pdfnames(names): 
...  print name 
... 
/Adobe Green 
/PANTONE 5757 CV 
/paired()parentheses 
/The_Key_of_F#_Minor 
/AB 
/Name1 
/ASomewhatLongerName 
/A;Name_With-Various***Characters? 
/1.2 
/$$ 
/@pattern 
/.notdef 

더있다 더 영리한 방법 그 내가 알고있어; re 엔진은 그렇지 않으면 대체와 일치를 결합 할 수 없습니다.

+0

고마워, 그럼're.sub' 그것은 :) – root

1

re.sub을 살펴보십시오.

16 진수 '# [0-9A-F] {2}'숫자를 일치시키고 함수를 사용하여이를 변환하는 기능과 함께 사용할 수 있습니다.

예.

def hexrepl(m): 
    return chr(int(m.group(0)[1:3],16)) 

re.sub(r'#[0-9A-F]{2}', hexrepl, '/Adobe#20Green') 

'/ 어도비 그린'을 반환합니다

나는 래퍼 생성기 finditer()을 사용하십시오
+0

나는 루트가're.sub '에 대해 잘 알고 있음을 잘 알고 있습니다 .. –

+0

@MartijnPieters 그런 다음 질문에 대해 언급해야합니다. 그리고 왜 그것이 작동하지 않습니다 :) –

+0

@ 잭 : 나는 명확히하기를 요구하고있다; 그가 원하는 것은 분명하지 않습니다. –