python
  • regex
  • string
  • variables
  • 2017-03-18 1 views 0 likes 
    0

    아래 코드를 사용하여 문자열에 "< <"및 ">>"로 묶인 단어를 찾아서 이전에 정의 된 관련 변수로 바꿉니다. 이 방법이 효과적이지만 더 안전하고 효율적인 방법이 있습니까? 나는 eval의 사용에 대한 몇 가지 경고를 보았고, 나의 해결책은 지나치게 복잡해 보였다.문자열에서 동적 변수를 파이썬으로 바꾸는 방법

    import re 
    
    aa = 'alpha' 
    bb = 'beta' 
    cc = 'gamma' 
    
    teststr = 'A for <<aa>>, b means <<bb>>, and c could be <<cc>>.' 
    
    matches = re.finditer('<<(\w*)>>', teststr) 
    
    for i in matches: 
        teststr = teststr.replace(i.group(0), eval(i.group(1))) 
    
    print teststr 
    

    답변

    1

    사전 및 교체 등의 람다 함수 사용

    >>> import re 
    >>> teststr = 'A for <<aa>>, b means <<bb>>, and c could be <<cc>>.' 
    >>> dico = { 'aa':'alpha', 'bb':'beta', 'cc':'gamma' } 
    >>> re.sub(r'<<([^>]*)>>', lambda m: dico[m.group(1)], teststr) 
    'A for alpha, b means beta, and c could be gamma.' 
    

    당신이 <<>> 사이의 각 문자열은 사전에 열쇠로 존재하는지 확실하지 않은 경우, 모든과 교대로 [^>]* 변경을 사용 가능한 키 : aa|bb|cc. 당신이 많은 키가 있고 손으로 만들고 싶어하지 않는 경우는 다음과 같이 동적으로 패턴을 구축 할 수 있습니다 :

    파이썬 2.7 :

    >>> re.sub(r'<<(%s)>>'%"|".join(sorted(dico.keys(), reverse=True)), lambda x: dico[x.group(1)], teststr) 
    

    파이썬 3.x를 :

    >>> re.sub(r'<<({})>>'.format("|".join(sorted(dico.keys(), reverse=True))), lambda x: dico[x.group(1)], teststr) 
    
    0

    대체를 얻으려면 dict를 사용하십시오.

    import re 
    d = {'aa': 'alpha', 'bb': 'beta', 'cc': 'gamma'} 
    
    teststr = 'A for <<aa>>, b means <<bb>>, and c could be <<cc>>.' 
    matches = re.finditer('<<(\w*)>>', teststr) 
    for i in matches: 
        teststr = teststr.replace(i.group(0), d[i.group(1)]) 
    print(teststr) 
    

    인쇄 A for alpha, b means beta, and c could be gamma.

    관련 문제