如何将包含数学表达式的字符串拆分为列表?

36 投票
12 回答
76038 浏览
提问于 2025-04-11 09:17

我该如何把这个字符串分割成小块:

"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']

撰写回答