如何将包含数学表达式的字符串拆分为列表?
我该如何把这个字符串分割成小块:
"2+24*48/32"
然后变成一个列表:
['2', '+', '24', '*', '48', '/', '32']
12 个回答
18
>>> import re
>>> re.findall(r'\d+|\D+', '2+24*48/32=10')
['2', '+', '24', '*', '48', '/', '32', '=', '10']
这个代码可以找到连续的数字或者连续的非数字字符。
每次找到的结果都会作为一个新的元素放到列表里。
根据你的需求,你可能需要调整这个正则表达式。例如,如果你想匹配带小数点的数字,就需要做一些修改。
>>> re.findall(r'[0-9\.]+|[^0-9\.]+', '2+24*48/32=10.1')
['2', '+', '24', '*', '48', '/', '32', '=', '10.1']
36
你可以使用来自 re
模块的 split
函数。
re.split(模式, 字符串, 最大分割次数=0, 标志=0)
这个函数会根据模式出现的地方来分割字符串。如果在模式中使用了捕获括号,那么模式中所有组的文本也会作为结果列表的一部分返回。
示例代码:
import re
data = re.split(r'(\D)', '2+24*48/32')
\D
当没有指定 UNICODE 标志时,\D 匹配任何非数字字符;这相当于集合 [^0-9]。
51
恰好你想要分割的那些标记已经是Python的标记了,所以你可以使用Python自带的tokenize
模块。这个程序几乎只需要一行代码;
from io import StringIO
from tokenize import generate_tokens
STRING = 1
print(
list(
token[STRING]
for token in generate_tokens(StringIO("2+24*48/32").readline)
if token[STRING]
)
)
它会产生这样的输出:
['2', '+', '24', '*', '48', '/', '32']