2014-04-23 4 views
1

저는 파이썬 스크립트를 사용하여 파일을 처리했습니다. 파일은 자동 작성이므로 키 앞뒤에 일부 문자를 추가 할 수 있습니다. 그래서 내가 그들에게 일치하는 정규 표현식을 사용 싶어 (중간 부분은 항상 동일하며, 그것을 할 수있는 문제는이다) : ".*"는 문자를 표시하기 때문에이 작동하지 않습니다정규식을 사전의 키로 사용하는 방법은 무엇입니까?

def dict(x): 
return{ 
    '.*key1.*': 'blabla', 
    '.*key2.*': 'thing' 
}.get(x,'default') 

.

이것을 수행하려면 어떻게해야합니까?

+0

없음을 사용하는 방법에 대한, 당신이 사용할 수있는 방법은 문자열이 핵심입니다, 그런데 왜 그냥 key1''로 사용하지 - BTW'r' 문자열 리터럴 –

+0

파일을 접두사 정규식 문자열 사용 내가 대우하고 싶은 것은 나에게서 어떤 통제도없이 창조하는 것이다. 그래서 제가 말했듯이, 문자는 "진짜"키 앞뒤에 인쇄 될 수 있습니다. 만약 key1이나 key2 만 사용한다면 dictionnary는 일치하지 않습니다 –

+0

Romain 나는 당신에게 질문을 오해했습니다. @mskimm 역시 좋은 트릭을 올렸습니다. –

답변

1

파일을 직접 일치시켜야합니다. get은 그렇게 할 수 없습니다. 당신이 최적화 할 수 있습니다 여기에 여러 가지가 있지만 아이디어가 뭔가

def get_content(filename): 
    lookup = (
     (r'.*key1.*', 'blahblah',), 
     (r'.*key2.*', 'thing',), 
    ) 
    for pattern, content in lookup: 
     if re.match(pattern, filename): 
      return content 

같은 수 있습니다 원하는 것은

.


편집 :

으로 mskimm에 의해 지적 Grijesh 차우 질문에 부착 된 코드는 지적 필요는 두 개의 추가 문제가 있습니다 함수로

  • 사용하지 마십시오 dict을 또는 변수 이름은 built-in type의 이름이므로. 정규식 패턴이 너무 자주 탈출이 필요한 문자를 사용하기 때문에 정규 표현식 패턴에 대한
  • 대신 표준 문자열 리터럴 ('like this')의 원시 문자열 리터럴 (접두사 r, r'like this'와 리터럴)를 사용합니다.

이 답변의 코드는 위의 두 가지 사항을 반영합니다.

+0

당신은 올바르게 질문을 얻지 못했습니다. 견인 점도 추가 할 수 있습니다. 1. 함수 또는 변수 이름으로 dict를 사용하지 마십시오. inbuild 유형입니다. 2. Regex의 경우 'r'접두사 문자열 리터를 사용하여 답변을 삭제합니다. –

+0

예, 당신이 그들을 지적하고 있습니다. 나는 그 (것)들을 추가하기 위하여 응답을 편집 할 것이다. – uranusjr

2

또는이 RegexDict

class RegexDict(dict): 
    import re 
    def __init__(self, *args, **kwds): 
     self.update(*args, **kwds) 

    def __getitem__(self, required): 
     for key in dict.__iter__(self): 
      if self.re.match(key, required): 
       return dict.__getitem__(self, key) 
     return dict.__getitem__(self, key) # redundancy but it can handle exceptions. 

regex_dict = RegexDict({'.*key1.*':'blabla', '.*key2.*':'thing'}) 

print regex_dict['foo_key1_bar'] # blabla 
print regex_dict['foo_key2_bar'] # thing 
관련 문제