2016-11-04 3 views
0

Wiktor Stribiżew의 제안을 통해이 문제를 해결했습니다.파이썬 정규 표현식 문자

편집 : 그 번호에 다른 작업을 수행해야하기 때문에 목록의 첫 번째 요소 만 추출하면됩니다. 테스트 용으로 코드에 루프를 사용합니다.

산술 표현식을 숫자 목록으로 분할하려고합니다. 예를 들어

: 1 + 0.2 (3^4) * 5 -> [ '1', '0.2', '3', '4', '5']

내가 재 라이브러리를 사용 파이썬에서는 표현식이 도트 문자 '.'로 분리됩니다. 나는 '을 포함하지 않지만.' delimers에서. 입력 1 + 0.2 때

즉, 출력 될 것이다 '1', '0'은 '2']해야는 [ '1', '0.2']는

코드는 수있는 아래 :

#!/bin/python 
import re 

delims = re.compile(r"[+-/*///^)]") 

while True: 
    string = input() 
    res = list() 
    i = 0 
    while i < len(string): 
     if string[i] >= '0' and string[i] <= '9': 
      num_str = delims.split(string[i:], 1)[0] 
      res.append(num_str) 
      i += len(num_str) - 1 
     i += 1 
    print(res) 

정말이 질문에 감사드립니다!

+1

'-'는 범위를 만들거나 이스케이프하거나 char 클래스의 끝/처음으로 이동하고'[- +/* ^)] '를 사용합니다 –

+0

[Here] (http://stackoverflow.com/questions)/32324595/error-in-regex-to-catch-special-characters/32324646 # 32324646) 비슷한 질문입니다. –

+0

고마워요! 당신은 훌륭합니다! –

답변

0

접근 방법이 효과가없는 이유는 도트가 포함 된 +-/ 인 문자 범위를 만드는 것입니다. 나는 또한 당신이 지나치게 복잡하다고 생각합니다.

import re 
str = '1+0.2-(3^4)*5' 
res = re.split(r'[-+()/*^]+', str) 
print(res) 

출력됩니다 ['1', '0.2', '3', '4', '5']

이 방법이 제대로 음수 처리되지 않습니다.

+0

음수에 대한 알림을 보내 주셔서 감사합니다! –

0

사용 re.findall 기능을 다음과 같은 방법 :

num_str = '1+0.2-(3^4)*5' 
numbers = re.findall(r'\d(?=[^.]|$)|\d+\.\d+', num_str) 

print(numbers) 

출력 : 당신은 단지 양의 정수를 추출 할 경우

['1', '0.2', '3', '4', '5'] 
0

, 다음을 시도해보십시오.

[int(s) for s in str.split() if s.isdigit()] 

이 세 가지 이유로 정규식 예보다 낫다 : 당신은 당신이 구문 분석 할 필요가 없기 때문에 그것은 더 읽기의, 을 다른 모듈을 필요로하지 않는 필자는 SIMBOLS와 숫자 사이에 공백이었다 가정하는 그 정규식 미니 언어 및 더 빠릅니다.

+0

이것으로 충분하고 효과가 있습니까? –

+0

네가 긍정과 음수를 구별하고 싶지 않으면 작동합니다. 이 일회용 솔루션은 정규 표현식을 사용하고 바퀴를 재발 명하는 것이 더 낫다고 생각합니다. –

+1

문자열의 숫자와 기호가'' ''공백으로 구분되지 않더라도? –