2012-10-30 1 views
0

아래 코드는 입력 된 문자열 (수학 표현식)을 사용하고 find 함수를 사용하여 "*/+ -"에서 연산자 중 하나를 찾고 이에 따라 문자열을 구분합니다 .파이썬 : 찾기 기능을 순서대로 사용하지 않음

def splitting1(z): 
    for operators in "*/+-": 
     if operators in z: 
      position1= z.find(operators) 
      position2= z.rfind(operators) 
      text_before_operators= (z[:position1]).strip() 
      text_after_operators= (z[(position1+1):(position2)]).strip() 
      return text_before_operators,text_after_operators 

내 문제는 내가 같은 3/5*7로 입력 된 표현이있는 경우 다음 position1 먼저 /을 발견하기 전에 *을 찾을 것입니다. 코드에서 'position1'을 가장 왼쪽 연산자와 연관 시키길 원합니다. for/in 함수를 사용할 때 연산자 우선 순위를 생략 할 수 있습니까? 그렇지 않다면 우선 순위를 생략 할 수있는 더 나은 문자열 조작기가있을 것입니다.

참고 z는 입력입니다. 그리고 모호성이 발생하는 경우 입력은 두 명의 연산자로 제한됩니다.

+0

참고 : 연산자는 모듈 이름이므로 해당 함수에서 사용하는 것은 나쁜 습관으로 간주 될 수 있습니다. –

+0

고마워요, 나쁜 변화가 있어요. – SeesSound

+0

수학 표현식을 평가하려는 경우, 이것이 완료된 방법이 아닙니다. 입력을 순차적으로 읽고 토큰 (숫자, 연산자)으로 분리하고 토큰을 shunting 야드 또는 하향식과 같은 구문 분석 알고리즘을 사용하여 올바른 "위치"에 놓습니다. – georg

답변

0

*/+-을 반복하고 있으므로 첫 번째 문자가 첫 번째 문자로 반환됩니다.

기본적으로 이러한 모든 연산자의 색인을 찾고 최대 또는 최소를 찾으려합니다. 시도 재 작성 문자열의 다른면 작동이 기능을 : 그래서

렉스하려고하는 것 같습니다
right_index = max(map(text.rfind, '+-/*')) 
+0

'index> position'인지 확인하고 있습니다. '-1'은'find'가 반환 할 수있는 가장 작은 인덱스입니다. – Blender

+0

그럼 내가이 권리가 있는지 말해줘. 코드에서 먼저 text.rfind (oper)를 사용하여 "*/- +"에서 첫 번째 연산자를 찾고, 그 중 하나가 발견되면 인덱스를 가져 와서 그 값을 position이라는 변수. 그러나 4 * 3/2와 같은 표현식을 사용하면 인덱스를 4로 설정 한 다음 position = 4로 설정하고 text.rfind를 text.find로 바꾸고 4 * 3/2에서 4로 바꾸면/2 * 3 그러면 동일한 문제가 연산에 그대로 적용됩니다. – SeesSound

+0

이 코드는 반복을 처리합니다. 그것은'rfind'와 같지만, 선택 목록에서 맨 오른쪽 문자를 찾습니다. – Blender

0

:

def find_operator_right(text): 
    position = -1 

    for oper in '*/+-': 
     index = text.rfind(oper) 

     if index > position: 
      position = index 

    return position 

약간 더 파이썬 솔루션은이 같은 것 이 목적을 위해 특별히 설계된 모듈을 살펴 보시기 바랍니다 (예 : ply).

. 그렇게 말하는

, 난 당신이 예를 들어 올바른 궤도에 있다고 생각하지만 (이에 대한보다 일반적인 렉서하기 위해) 일부 재귀 누락 다음을 찾을 수

def splitting1(z): 
    for char in "*/+-": 
     if char in z: 
      position = z.find(char) 
      text_before_operator= (z[:position]).strip() 
      text_after_operator= (z[position+1:]).strip() 
      return (char, splitting1(text_before_operator), splitting1(text_after_operator)) 
    return ("number", z) 

한 가지 방법을 에 관계없이 우선 순위 즉 생략 연산자 우선 순위의 가장 왼쪽에있는 연산자는, 당신이 반복 무엇을 다시 정렬 할 수 있습니다 :

def splitting2(z): 
    for char in z: 
     if char in "*/+-": 
      position = z.find(char) 
      text_before_operator= (z[:position]).strip() 
      text_after_operator= (z[position+1:]).strip() 
      return (char, splitting2(text_before_operator), splitting2(text_after_operator)) 
    return ("number", z) 

참고이 기능은 원래의 기능으로 다른 결과를 반환합니다.

+0

정말요 ?? 그래서 저는 두 줄을 바꾸어야했습니다.와, 감사합니다. 하지만 OP 코드가 게시 한 두 번째 코드와 다른 점은 무엇입니까? OP 코드는 다음과 같이 말합니다 : "*/+ -"의 연산자와 연산자가 문자열 z에 있다면 ..... 그리고 문자열 z의 연산자에 대해 연산자는 다음 "if "코드 라인 ... – SeesSound

+0

반환 값은 for 루프를 깰 수 있으므로 반복되는 값을 변경하면 반환 값을 변경할 수 있습니다. 'z ='/ * ''가 처음에는''* '를 반환하면 ... '/ '...를 반환합니다. –

+0

줄의 순서를 바꾸지 않아도 아무 것도 바뀌지 않습니다 ... – SeesSound

관련 문제