【问题标题】:Python - IndexError: list index out of range - For loop / While loopPython - IndexError:列表索引超出范围 - For 循环/While 循环
【发布时间】:2016-12-24 23:27:58
【问题描述】:

我有这个字符串:

string="R$ 35.0123. "

我想清理它,把最后一个点和那个空间去掉。让它看起来像这样:

string:"R$ 35.0123"

我正在尝试使用这个:

while string[-1].isdigit()==False:
      string=string[:-1]

但是我收到了这个错误:

IndexError: list index out of range

奇怪的是我在 for 循环中运行它,如果循环列表只有一个项目,它工作正常。如果列表有两个项目,就会出现这个问题。

有什么想法吗? 祝大家圣诞快乐。

以下是完整代码 (字符串是变量“valor”)

if CNPJ in page:
    CNPJloc=[]
    for i in (re.finditer(CNPJ,page)):
        CNPJloc.append(i.start())

    for i in CNPJloc:
        CNPJposition=i
        beg_string=["aviao"]
        end_string="sicon"
        for i in beg_string:
            if i in lower_page[CNPJposition-200:]:
                beg_string=i                
                extrato_de_contrato=page[lower_page.rfind(beg_string,0,CNPJposition):lower_page.find(end_string,CNPJposition)]
                lower_extrato=extrato_de_contrato.lower()
                def valor():
                    valor=["valor do contrato:","valor:"]
                    for i in valor:
                        if i in lower_extrato:
                            valor=extrato_de_contrato[lower_extrato.rfind(i)+len(i):lower_extrato.find("fonte",lower_extrato.rfind(i))]
                        while valor[-1].isdigit()==False:
                            valor=valor[:-1]
                    print("Valor Total: ", valor)
                    return valor
                valor()

【问题讨论】:

    标签: python string for-loop while-loop


    【解决方案1】:

    您可能遇到的字符串不符合您的格式,并且不包含数字。

    尝试通过添加len(x) > 0 指示符来保护您的循环:

    while len(string) > 0 and not string[-1].isdigit():
         del string[-1]
    

    如果你只想从字符串中提取整数,我建议使用正则表达式:

    import re
    matches = re.findall('\d+\.?\d*', string)
    string = int(matches[0]) if len(matches) > 0 else 0
    

    【讨论】:

      【解决方案2】:

      Python 具有内置功能,可以通过 rstrip 执行此操作

      string.rstrip('. ')
      

      输出

      'R$ 35.0123'
      

      听起来您只需要删除最后一个点以及之后的所有内容。使用正则表达式

      import re
      re.sub('(\.[^.]*)$', '', string)
      

      【讨论】:

      • 很好,谢谢。问题是有时它可能是“。”,有时可能只是“。”其他时间可以是“.xzxzx”。
      • 另见 str.rsplitsep='.'maxsplit=1
      【解决方案3】:

      我发现了问题...很好的旧缩进错误:

      代替:

                  def valor():
                      valor=["valor do contrato:","valor:"]
                      for i in valor:
                          if i in lower_extrato:
                              valor=extrato_de_contrato[lower_extrato.rfind(i)+len(i):lower_extrato.find("fonte",lower_extrato.rfind(i))]
                          while valor[-1].isdigit()==False:
                              valor=valor[:-1]
      

      应该是这样的:

                  def valor():
                      valor=["valor do contrato:","valor:"]
                      for i in valor:
                          if i in lower_extrato:
                              valor=extrato_de_contrato[lower_extrato.rfind(i)+len(i):lower_extrato.find("fonte",lower_extrato.rfind(i))]
                          --> while valor[-1].isdigit()==False:
                          -->     valor=valor[:-1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 2019-05-21
        • 2022-06-13
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 2020-09-07
        • 2020-07-23
        相关资源
        最近更新 更多