Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 标记表达式_Python - Fatal编程技术网

Python 标记表达式

Python 标记表达式,python,Python,我编写了一个标记数学表达式的代码: def tokenList(s): tokens = [] # to remove whitespaces in between the expression if ' ' in s: expression = s.replace(" ", "") s_holder = expression else: s_holder = list(s)

我编写了一个标记数学表达式的代码:

def tokenList(s):
    tokens = []
    # to remove whitespaces in between the expression
    if ' ' in s:
        expression = s.replace(" ", "")
        s_holder = expression
    else:
        s_holder = list(s)

    # identifying each character from the expression, and appending it to the list
    for i in s_holder:
        if i.isdigit():
            tokens.append(i)
        elif i == '*' or i == '/' or i == '^' or i == '(' or i == ')' or i == '+' or i == '-' or i == '=':
            tokens.append(i)
        else:
            return []
    return tokens


print(tokenList(input()))
这段代码的问题是,如果我输入一个带有连续整数的表达式,比如说
123+5

它返回
['1'、'2'、'3'、'+'、'5']
而不是
['123'、'+'、'5']
。如何修复此问题?

如果令牌仅收集数字和您指定的符号,则可以执行以下操作并继续创建数字字符串,直到找到不同类型的字符,然后将其追加。当然,使用正则表达式将是一个更好的解决方案,但为了便于阅读,我用了一种天真的方式

def tokenlist(s:str):
    s_copy = s.replace(" ", "")
    tokens = []
    output = ''
    for i in range(len(s_copy)):
        letter = s_copy[i]
        if letter == '*' or letter == '/' or letter == '^' or letter == '(' or letter == ')' or letter == '+' or letter == '-' or letter == '=':
            if len(output) > 0:
                tokens.append(output)
                output = ''
            tokens.append(letter)
        elif letter.isdigit():
            output += letter
    if len(output) > 0:
        tokens.append(output)
    return tokens

不要立即在每个数字上追加ing,而是累加所有连续的数字并在最后追加。这可以通过以下几种方式实现:

以您的方法为基础: 首先为数字定义一个字符串变量。然后,每次你得到一个数字,把它附加到那个字符串上。一旦你到达一个符号,你就知道这个数字已经完成了-所以首先附加它,重置它,然后继续处理这个符号(也附加它):

def令牌列表:
...
num=“”
对于i in s_持有人:
如果i.isdigit():
num+=i
“*/^()+-=”中的elif i:
如果num:
tokens.append(num)
num=“”
标记。附加(i)
其他:
返回[]
如果num:
tokens.append(num)
...
使用groupby: 使用内置的可将所有数字组合在一起:

从itertools导入groupby
def令牌列表:
...
对于键,在groupby中分组(s_holder,key=lambda i:i.isdigit()):
如果键为:
标记.append(“”.join(组))
其他:
令牌。扩展(组)
...
正则表达式 最后,您可以使用简单的正则表达式将数字分组:

重新导入
def令牌列表:
返回re.findall(r“\d+|[*/^()+-=]”,s)

@Tomerikoo我该怎么做?你的函数中有很多不必要的代码。函数实际上希望在多个分隔符处拆分输入字符串,并保留分隔符。所以,这一行代码可以做到:
tokens=re.split(r'(\*\\/\\\^\\\(\124\)\+\\-\\='),s)
@costaparas为什么不
r'([*/^()+-=])
而不是:
r'([*/^()+-=])
这是有效的!但是你能给我解释一下“*/^()+-=”中的
elif i有什么作用:if num:tokens.append(num)num=”“tokens.append(i)
def tokenList(s):
    tokens = []
    for i in s:
        if i and i.isdigit():
            if tokens and tokens[-1].isdigit():
                tokens[-1]+=i
            else:
                tokens.append(i)
        elif i in '*/^()+-=':
            tokens.append(i)
    return tokens
print(tokenList(input()))