1
jmc891205 2018-04-25 14:07:33 +08:00
用正则表达式先把所有的数字搞出来
再用正则表达式把所有的非数字搞出来 |
2
nethard 2018-04-25 14:11:03 +08:00
了解一下有限状态机
|
3
Sylv 2018-04-25 14:45:25 +08:00 via iPhone
逆波兰表达式了解下。
|
4
cfwyy 2018-04-25 15:26:49 +08:00
本来字符和数字匹配用正则都是可以的,不过你是为了什么 ,计算四则运算?
这种还是用 后缀表达式比较好,就是楼上就的逆波兰表达式 可以了解一下。 |
5
peinstrike 2018-04-25 18:38:16 +08:00
python cookbook 上有现成的代码。
|
6
siteshen 2018-04-26 01:44:28 +08:00
# -*- coding: utf-8 -*-
# 不是很清楚你的需求,写了个函数收集字符串中的连续数字和连续符号,供参考。 def collect(string): operands = [] operators = [] last_symbol = '' is_last_digit = False for s in string: if is_last_digit: if s.isdigit(): # both are digist, append last_symbol += s else: # digist and not digist, end scaning operands.append(last_symbol) last_symbol = s else: if not s.isdigit(): # both are not digist, append last_symbol += s else: # digist and not digist, end scaning operators.append(last_symbol) last_symbol = s is_last_digit = s.isdigit() # append last symbol if is_last_digit: operands.append(last_symbol) else: operators.append(last_symbol) return operands, operators if __name__ == '__main__': print(collect('(40+26*55)-1102-11')) print(collect('40+26*55-1102-11')) # `for` 和 `# appending last symbol` 后的 `if` 一个缩进层级,其他的缩进层级应该不需要额外的说明。 # 输出结果如下(本地没 python3 ) # (['40', '26', '55', '1102', '11'], ['(', '+', '*', ')-', '-']) # (['40', '26', '55', '1102', '11'], ['', '+', '*', '-', '-']) |
7
xpresslink 2018-04-26 09:41:48 +08:00
@siteshen
哪用得着那么麻烦啊, 看着都累。 >>> nnn = '(40+26*55)-1102-11' >>> import re >>> numbers = re.findall('\d+', nnn) >>> operators = re.split('\d+', nnn) >>> [numbers, operators] [['40', '26', '55', '1102', '11'], ['(', '+', '*', ')-', '-', '']] >>> |