2012-04-19 2 views
6

내가있는 경우 :정규 표현식을 사용하여 수학 방정식에서 중첩 괄호를 처리합니까?

statement = "(2*(3+1))*2" 

은 내가 쓰고 있어요 수학 독자 괄호 안에 여러 괄호를 처리 할 수 ​​있어야합니다. 아마도 나는 잘못된 방향으로 가고 있습니다. 그러나 목표는 아무 것도 없을 때까지 반복적으로 괄호 안으로 들어가서 수학 연산을 수행하는 것이 었습니다. 따라서, 내가 먼저 내가 정규식의 시작 인덱스와 정규식의 종료 인덱스에 초점 값을 할당하여이 작업을 수행하기를 희망

"(3+1)" 

에 초점을

"(2*(3+1))" 

에 초점을 맞출 것 . 끝 인덱스를 찾는 방법을 아직 알지 못했지만 처음에는 정규식과 더 일치하는 데 더 관심이 있습니다.

r"\(.+\)" 

일치하지 않았습니다. 나는 "괄호 집합 안에 포함 된 하나 이상의 문자"로 읽길 원했습니다. 누군가 위의 표현이 python의 위 문장과 일치하지 않는 이유를 설명 할 수 있습니까?

+0

파서? .......... –

+0

['r "\ (. + \)"는 일치하지 않습니다.] (http://ideone.com/oJQjV) – Amber

답변

12

정규식을 매우 좋아합니다. 나는 항상 그들을 사용한다.

정규식을 사용하지 마십시오.

실제 수학 구문을 구문 분석 할 실제 파서가 필요합니다. 이 부분을 읽어보십시오 :

http://effbot.org/zone/simple-top-down-parsing.htm

실제로 발현을 분석하면, 그것은 구문 분석 트리를 걸어 결과를 계산하기 위해 사소한.

EDIT : @Lattyware는 pyparsing을 제안했는데, 이것은 또한 좋은 방법이어야하며 위에 게시 된 EFFBot 솔루션보다 쉽습니다.

http://pyparsing.wikispaces.com

다음은 사칙 대수 식 계산기에 대한 대한 파싱 샘플 코드에 대한 직접 링크는 다음과 같습니다

http://pyparsing.wikispaces.com/file/view/fourFn.py

아마 steveha에 동의하고, 이것에 대한 정규식을하지 않는 것이 좋습니다
+0

언급할만한 가치가있을 수도 있습니다. [pyparsing''] (http://pyparsing.wikispaces.com/) - 이것이 모두 필요한 것이라면 과잉이라고 할 수있다. –

+0

@Lattyware 파이썬 프로그램을 사용하여 파일을 구문 분석하고 해당 내용을 다른 언어의 코드처럼 해석하고 싶다면 pyparsing을 사용 하시길 권장할까요? – purpleladydragons

+1

@purpleladydragons에서 pyparsing은 필요한 파서를 작성하기위한 키트입니다. pyparsing을위한 샘플 코드에는 "4 함수 대수 표기법 파서"가 포함되어 있으므로 시작점을 제공 할 수 있습니다. http://pyparsing.wikispaces.com/file/view/fourFn.py – steveha

1

그러나 질문에 구체적으로 답하기 위해서는 결과 그룹을 꺼내기 위해 이스케이프 처리되지 않은 괄호가 필요합니다 (패턴은 괄호에서 제외되었습니다).

>>> re.match(r"\((.+)\)", "(2*(3+1))*2").group(1) 
'2*(3+1)' 

만약 당신이 그 길로 가면, 당신은 경기가 끝날 때까지 경기 결과를 반복 할 수 있습니다. 그것은 가치가 무엇인지에 대한

2

, 여기에 좀 더 문맥의 :

정규 표현식가 호출된다 "일반"그들은 (무제한) 정규 문법과 관련된하고 있으며, 일반 문법 설명 할 수 없기 때문에 중첩 된 괄호 (그들은 임의의 괄호를 설명 할 수는 있지만 깔끔한 쌍으로 일치시킬 수는 없습니다.

이것을 이해하는 한 가지 방법은 정규 표현식이 최종적으로 설명 할 수있는 몇 가지 세부 사항을 결정 론적 유한 자동 장치로 변환 할 수 있다는 것을 이해하는 것입니다. 위협적으로 들리 겠지만 실제로는 규칙이 "규칙"목록으로 변환 될 수 있다는 것을 의미합니다. 여기서 규칙은 사용자가 일치시킨 것에 달려 있으며 일치 할 수있는 것을 설명합니다.

예를 들어, 정규 표현식 ab*c가 변환 할 수 있습니다 : 시작에

  1. a을 일치시킬 수 있습니다. 다음 지금, 당신이 b을 일치시킬 수 있습니다 2.

  2. 에 가서 2로 다시 이동하거나 일치 c을하고 완료 3

  3. 로 이동합니다! 성냥은 성공이었다!

이며 "결정 론적 유한 오토마타"입니다.

어쨌든이 흥미로운 부분은 앉아서 괄호 쌍과 일치하는 것을 만들려고 시도 할 수 없다는 것입니다. 시도 해봐. 당신은 더 많은 규칙을 만들어 유한 수를 매치 할 수 있지만 괄호의 무제한 수와 일치하는 일반적인 규칙 집합을 작성할 수 없습니다 (규칙은 "X가 일치하면 규칙이 양식에 추가되어야 함을 명심해야합니다 ~ Y ").

이제 분명히 다양한 방법으로 수정할 수 있습니다. 보다 복잡한 규칙 (예 : 괄호 수를 늘릴 수 있도록 규칙을 확장하는 것)을 허용하면 원하는대로 작동하는 것을 얻을 수 있습니다. 정규 문법은 아닙니다.

정규 표현식이 이런 식으로 제한된다는 점을 감안할 때 왜 더 복잡한 것이 아닌 사용되는 이유는 무엇입니까? 그것들은 꽤 좋은 곳이라는 것이 밝혀졌습니다. 그들은 아주 간단하고 효율적으로 많은 것을 할 수 있습니다. 더 복잡한 문법 (규칙의 종류)은 더 강력 할 수 있지만 구현하기가 더 어렵고 효율성에 더 많은 문제가 있습니다.

최종 면책 조항 및 약속 된 추가 세부 정보 : 실제로 많은 정규 표현식이 요즘 실제로 이며 실제로는 "정규식"이라고해서는 안됩니다. 하지만 위의 내용은 여전히 ​​정규 표현식을 사용하지 말아야하는 이유에 대한 기본적인 설명입니다.

ps jesse의 제안 솔루션은 regexp를 여러 번 사용하여이 문제를 해결합니다. 여기에있는 인수는 정규 표현식을 한 번 사용하는 것에 대한 것입니다.

+0

위의 간략한 요약 : "정규 표현식은 계산할 수 없습니다."정규식을 반복적으로 적용하여 괄호로 표현식을 처리하도록하는 작업이 많이 필요할 것입니다. – steveha

관련 문제