2015-01-06 10 views
4

정규 표현식 라이브러리는 일반적으로 문자열로 작업합니다 (예 : Python의 re 모듈). 그러나 정규식에 대한 아이디어는 임의의 객체로 쉽게 확장 할 수 있습니다. 객체에서 필요한 것은 평등 comparsion뿐입니다.임의의 객체에 대한 정규 표현 일반화

문자 대신 임의의 객체 시퀀스에 정규 표현식을 사용할 수있는 라이브러리 (예 : Python)가 있습니까? 아니면 non-string에 regexp 라이브러리를 사용하는 것을 허용하는 더러운 해킹이 있을까요?

+0

는 유스 케이스 무엇입니까? 당신이 당신의 객체에 대해 "문자열로"메소드를 가지고 있지 않다면 나에게 이해가되지 않을 것입니다 ... – HamZa

+3

@HamZa _ "사용 사례는 무엇입니까?"_ : 예를 들어 이벤트 목록에서 패턴 탐지. –

+1

@HamZa 현재, 나는 키 누름의 순서 (vim-style, 하나의 동작에 매핑 된 많은 키 시퀀스가있을 수 있으며,'12ab'는'ab' 명령을 수행합니다. 시간 등). – wrwt

답변

1

일종의 정렬 ... 그러나 일치시킬 패턴을 설명하는 방법이 필요하며 이는 단지 문자열을 사용할 수도 있습니다.

다음은 일반 표현식을 사용하여 쿼리 할 수있는 일반 ActionActionList을 사용하는 방법의 실제적인 예입니다.

import re 

class Action(object): 
    def __str__(self): 
    return self.re 

class Jump(Action): 
    re = "J" 
class Run(Action): 
    re = "R" 

class ActionList(list): 
    def __init__(self, *args): 
    super(ActionList, self).__init__(self) 
    for i in args: 
     self.append(i) 
    def re_search(self,regex): 
    s = "".join(str(i) for i in self) 
    return re.search(regex,s) 

al = ActionList(Jump(),Run(),Jump(),Jump()) 

그런 전화 :

type(al[al.re_search("JJ").pos]) 

3에있는 요소를 제공합니다

<class '__main__.Jump'> 

동안 :

al.re_search("R.R") 

아무것도 제공하지 않습니다.