2016-11-17 1 views
0

파이썬 인터 피터처럼 계산기를 작성하기 위해 내 표현의 유효성을 확인하고 싶습니다.Python Search 문자열에서 반복 연산자

반복되는 수학 연산자에 대한 문자열을 확인하고 싶습니다. 아무 것도 잡으려는 것이 아니라 단지 존재 여부를 알기 위해서입니다.이 경우 표현식이 유효하지 않습니다.

4 ++ - + 4가 유효합니다.

4 * -8 광산은 아마 여기에 실패,

3-/7

4/-4가 유효 무효 유효하지 않습니다.

minut 및 plus는 스스로를 반복 할 수 있지만 -는 예를 들어 유효하지 않습니다. python interpeter가 작동하는 방식과 매우 비슷합니다. 이것은 내가 Regex로 가지고있는 것입니다. 그러나 더 간단한 해결책은 환영합니다. 심지어 정규 표현식도 훌륭하지 않습니다.

[*/^%\-+][*/^%] | [\-+*/^%][*/^%] 

Link

Basicially 사업자 */^ %가 있는지 확인 - + 어느 다시

+0

연산자는 공백으로 구분됩니까? –

+0

연산자는 공백으로 구분되지 않으며 공백이 텍스트에 없습니다. (이것에 대해 언급 했어야합니까?) – Lumon

+0

'^^ '의 결과는 정확히 무엇입니까? 고양이? 문제를 재정의하는 것이 좋습니다. – Jan

답변

1

(마이너스 및 플러스없이) */^ %만큼 더 간결한 용액 것이 선행 또는 따른다 infix 표현식에 대한 CFG 또는 스택 기반 접근 방식이 될 수 있습니다. 그러나 해킹하고 실험 할 수있는 것은 다음과 같은 아이디어입니다.

from itertools import product as p 
all=list(p('*/^%-+',repeat=2)) 
all=map(lambda x:''.join(x),all) 

invalids=[..write them by hand in here(hacky part)] 
valids=filter(lambda x:x not in invalids,all) 

을 그리고 지금 당신은 당신이의 창으로 문자열을 검색 할 수 있습니다 길이 2의 모든 유효한 작업으로 남겨, 당신은 찾을 때

지금처럼 모든 사업자의 제품 구성 유효 기간에 속하지 않는 한 쌍의 연산자는 표현식이 유효하지 않음을 선언하고 계속 진행할 수 있습니다.

당신이 갈 수있는 또 다른 방법은 규칙 기반의 방법입니다. 연산자를 키로 사용하여 사전을 구성하고 각 연산자에 대해 값은 그 뒤에 올 수있는 모든 연산자가 들어있는 목록이됩니다. 당신이 CFG 솔루션과 아름다운을 발견 할 경우

그런 다음 문제가

string[i+1] in dictionary[string[i]]

되는 유효 조건과 캐릭터에 내가 당신의 문자열을 확인 중 하나가 알려 어떤 경우