2011-09-12 6 views
3

대용량의 텍스트 (단일 문자열)에서 사용한 정규식 패턴이 있습니다. 원래 텍스트의 여러 연속되지 않은 영역은 정규 표현식과 일치합니다. 이제는 상태 머신을 작성하고, 텍스트를 반복하고, 위치에서 char을 기반으로 다른 작업을 수행하고,이 위치가 정규식 일치 범위 내에 있는지 확인하려고합니다.Python 정규식 : 문자열의 문자가 정규식 일치 하위 문자열의 범위 내에 있는지 확인하는 방법은 무엇입니까?

RE.finditer (text)를 사용하면 모든 부분 문자열을 찾아 범위를 추출 할 수 있으므로 예를 들어 작업 할 튜플 목록이 있습니다.

(1, 5) (10, 15) (20, 55), 등

내 문자열의 문자의 인덱스에 대해,이 정보로

, I보고하는 알고리즘을 작성할 수있다 그 문자가 정규식 문자열의 일부인 경우. 예를 들어, 주어진 문자 6, 나는 스팬 목록을 검토하여 일치하는 하위 문자열의 일부가 아닌지 결정할 수 있습니다.

더 좋은 방법이 있나요? 사전에

감사합니다,

JW

+0

구문 분석기 FSM을 쓰고 싶습니다. (otehr 것 중에서) 토큰 화합니다. com ma 문자를 사용할 수 있습니다. 문법뿐만 아니라 * antlr/lex *가 FSM을 만들도록 자신의 상태 기계를 쓰고 싶습니까? – smci

+0

예, 내 lex/yacc가 약간 퍼지다. :). – wk1989

+0

필요한 모든 것이 식별자 안에 쉼표로 이스케이프 된 것과 일치하는 정규식 인 경우 파서 FSM을 작성할 필요가 없습니다. 이제는 모든''bbbb /, ccccc' *를 하나의 토큰 또는 3 개로 캡처하고 싶습니까? – smci

답변

1

편집 : 당신은 (무엇보다도)들이 탈출하지 않는 경우에만, 쉼표 문자를 토큰 화 자신의 파서 FSM을 기록 할 것 소리. 다음 정규식은 식별자에 대해 작동하며 이스케이프 된 쉼표를 포함 할 수 있습니다.

input = r'aaaaa,bbbb/,ccccc,dddddd,' 

pat = re.compile(r'((\w+|/,)+)') 

for mat in re.finditer(pat, input): 
    ... do stuff with mat.group(0) 

(원래 답 : 좋은 해결책이 될 수 있다고,하지만 당신은 우리에게 말할 수있는 충분한 환경을 제공하지 않을

문자가 발생 당신은 ANTLR/렉스 이것을 사용할 수 있습니다. 한 번 또는 두 번? 한 번 발생하면 string.find(char)의 색인이 정규식 일치 범위 내에 있는지 확인할 수 있습니다.

임의의 문자입니까? 구체적인 예를 들어주세요. 왜 y 문자 단위로이 작업을 수행합니까? 아마도 여러 개의 문자를 순차적으로 검사하지 않고있는 것입니까?

원하는 결과가 부울 ('예, 일부 정규식 일치 범위 내에서'char '이 발견되었습니다')? 그리고 숯이 발견 된 경우에 당신이 무엇을할까요? 여기 은 당신이 찾고있는 무엇을해야 할 일부 의사 파이썬 코드

(?=<,)(?:[^,]|(?=</),)(?=,) 

원래 답변 :

+0

나는 문자열을 반복하고 문자가 무엇인지에 따라 특정 동작을 수행하는 상태 기계를 가지고 있으며 또한 문자가 정규 표현식 일치의 일부인지 여부를 확인합니다. 예를 들어 문자가 ","이고 정규 표현식 부분 문자열의 일부가 아닌 경우 (즉, 특정 정규 표현식과 일치하는 부분 문자열 내에있는 경우 ','를 모두 무시하고 싶습니다.) 그래서 같은 문자의 여러 인스턴스를 처리 할 것이고 각각이 정규 표현식에 일치하는 하위 문자열의 일부인지 여부를 알아야합니다. 희망이 그것을 지워, 감사합니다. – wk1989

+0

여전히 컨텍스트가 충분하지 않습니다. ** 문자열 입력 및 출력의 구체적인 예를 게시하십시오. ** 왜 일반화 된 상태 시스템을 작성하고 있습니까? 귀하의 목표입니까, 아니면 구현 한 것입니까? ** ** 왜 ** 정규 표현식과 쉼표 문자를 일치 시키려고합니까? 해결해야 할 특정 문제가 무엇입니까? – smci

+0

일치하는 ignoreChars의 범위 만 무시하려면 'string.translate (... deleteChars)'를 적용하십시오. – smci

1

편집 여기 , 사이에있는 텍스트가 , 탈출 무시 사로 잡고 정규식입니다 :

pattern = re.compile(...) 
pos = 0 

while (match = pattern.search(haystack, pos)) { 
    for (i in range(pos, match.start) 
    //These chars are outside the match. 

    for (i in group(0)) 
    //The chars are in the match 

    pos = match.end 

//Finish with the rest of the chars not matched 
for (i in range(pos, len(haystack)) 
    //These chars are outside the match. 
+1

'haystack'을 잡으십시오. 그것은 soooo PHP입니다 – NullUserException

관련 문제