2016-11-04 100 views
0

我已经通过WiktorStribiżew的建议解决了这个问题。Python正则表达式点字符

已编辑:我只需要一次提取列表的第一个元素,因为我需要对该数字执行其他操作。我在我的代码中使用了一个循环来进行测试。

我想将算术表达式拆分为数字列表。

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

我使用重新库在Python中,但表达式是用点符号''分割的。虽然我不包括'。'在delmiters。

即,当输入是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

如果你只是想只提取正整数,请尝试以下。香港专业教育学院认为是在simbols和数字之间的空格:

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

这比正则表达式的例子有三个原因更好: 你不需要另一个模块, 这是更具可读性,因为你不需要解析正则表达式迷你语言和 它更快。

+0

你确定这是足够的,将工作? –

+0

是的,如果你不想区分正数和负数,它就可以工作。我认为这种单线解决方案更适合使用正则表达式并重新发明轮子。 –

+1

即使字符串中的数字和符号没有用空格“'”分隔吗? –