如何从字符串中的计算器表达式中删除前导零?蟒蛇

时间:2020-11-04 18:15:39

标签: python string strsplit leading-zero

我对python有疑问 字符串为pip install fyers_api

如何将其转换为“ 123 + 567 * 29 / 3-7”

即使后来我用section '.data' data readable writable ;секция данных string db 'Hello world',0 ;исходная строка substring db 'orl',0 ;искомая строка output db "The substring was encountered %d times", 0 ;текст сообщения section '.code' code readable writable executable ;секция кода start: cld ;очищаем флаг направления DF xor ebx, ebx ;очищаем EBX как счётчик подстрок mov esi, string ;перемещаем строку в ESI mov edx, substring ;перемещаем искомую подстроку в EDX mov ecx, 11 ;перемещаем длину строки в ECX cmp byte [esi],0 ;если строка закончилась, переходим на FINISH je FINISH cmp byte [edi],0 ;если подстрока закончилась, переходим на FINISH je FINISH SEARCH: mov al, [edx] ;перемещаем первый символ искомой подстроки в AL repnz scasb ;пока символы строки не совпадают с данным символом подстроки, проходим jcxz FINISH ;если строка закончилась, переходим на FINISH CHECK: inc edx ;переходим на следующий символ подстроки cmp byte [edx], 0 ;проверяем, закончилась ли искомая подстрока jz FOUND ;если конец искомой подстроки, переходим на FOUND inc esi ;переходим на следующий символ строки dec ecx ;уменьшаем ECX на 1 jcxz FINISH ;если строка закончилась, переходим на FINISH mov al, [edx] ;перемещаем следующий символ искомой подстроки в AL cmp byte [esi], al ;проверяем текущий символ строки jne SEARCH ;если символы не равны, переходим на SEARCH jmp CHECK ;если символы равны, переходим на CHECK FOUND: inc ebx ;увеличиваем EBX inc esi ;переходим на следующий символ строки dec ecx ;уменьшаем ECX на 1 jcxz FINISH ;если строка закончилась, переходим на FINISH jmp SEARCH ;переходим на SEARCH FINISH: ccall [printf], output, ebx ccall [getchar] stdcall [ExitProcess],0 尝试了Z = "00123+0567*29/03-7" 但它将正确拆分,但要使用与re.split('[+]|[*]|-|/', Z)

中的字符串“ Z”相同的操作数进行联接

解决方法

5 个答案:

答案 0 :(得分:1)

def cut_zeroes(Z):
    i, res = 0, []
    n = len(Z)

    while i < n:
        j = i
        while i < n and Z[i] not in '+-/*':
            i += 1
        res.append(int(Z[j:i]))

        if i < n:
            res.append(Z[i])

        i += 1

    return ''.join(map(str,res))
  

Z = "00123+0567*29/03-700"
print(cut_zeroes(Z))

答案 1 :(得分:1)

Z = "00123+0567*29/03-7"
print Z

import re
res = re.split(r'(\D)', Z)
print res

empty_lst = []
for i in res :
    i = i.lstrip("0")
    empty_lst.append(i)
    print i
print empty_lst
new_str = ''.join(empty_lst)
print new_str

答案 2 :(得分:1)

def zero_simplify(Z):
    from re import sub
    return [char for char in sub("0{2,}", "0", Z)]

Z = "00123+0567*29/03-7+0-000"
Z = zero_simplify(Z)
pos = len(Z)-1
while pos>-1:
    if Z[pos]=="0":
        end = pos
        while Z[pos] == "0":
            pos-=1
            if pos==-1:
                del Z[pos+1:end+1]
        if (not Z[pos].isdigit()) and (Z[pos] != ".") and (Z[pos] == "0"):
            del Z[pos+1:end+1]
    else:
        pos-=1
Z = "".join(Z)
print(Z)

设置Z,将其“列出”,然后将pos设置为Z中的最后一个位置。然后,它使用循环和0删除所有不必要的Z = "".join(Z)。然后最后printZ。如果您希望某个函数删除零,则可以通过以下方式实现它:

def zero_simplify(Z):
    from re import sub
    return [char for char in sub("0{2,}", "0", Z)]

def remove_unnecessary_zeroes(Z):
    Z = [char for char in Z]
    pos = len(Z)-1
    while pos>-1:
        if Z[pos]=="0":
            end = pos
            while Z[pos] == "0":
                pos-=1
                if pos==-1:
                    del Z[pos+1:end+1]
            if (not Z[pos].isdigit()) and (Z[pos] != ".") and (Z[pos] == "0"):
                del Z[pos+1:end+1]
        else:
            pos-=1
    Z = "".join(Z)
    return Z
Z = "00123+0567*29/03-7+0-000"
print(remove_unnecessary_zeroes(Z))

自己尝试一下,并在评论中告诉我它是否对您有用!

答案 3 :(得分:0)

这是一个简洁的(如果您删除了代码中的所有注释),这是一种优雅的方法:

import re

Z = "00123+0567*29/03-7"

operators = re.findall('\D', Z)               # List all the operators used in the string
nums = re.split('\D', Z)                      # List all the numbers in the list

operators.append('')                          # Add an empty operator at the end
nums = [num.lstrip('0') for num in nums]      # Strip all the leading zeroes from each numbers

# Create a list with the operands (numbers) concatenated by operators

num_operator_list = [nums[i] + operators[i] for i in range(len(nums))]

# Join all the intermediate expressions to create a final expression

final_expression = ''.join(num_operator_list)
print(final_expression)

输出

123+567*29/3-7

说明

首先,您需要将运算符和操作数分开,然后从每个操作数中lstrip分开零。之后,在操作员列表末尾添加其他空操作员。然后将每个操作数与相应的运算符连接(空运算符与最后一个操作数连接)。最后,加入列表以获得最终表达式。

答案 4 :(得分:0)

可以使用正则表达式完成

import re
Z = "00123+0567*29/03-7"
r1=r"(\D)0+(\d+)"
r2=r"\b0+(\d+)"
#substitute non-digit,leading zeroes, digits with non-digit and digits
sub1=re.sub(r1,r"\1\2",Z)
#substitute start of string, leading zeroes, digits with digits
sub2=re.sub(r2,r"\1",sub1)
print(sub2)

这是通过两次通过(以处理字符串开头的前导零)完成的,我不知道是否可以一次通过。