【问题标题】:why is the python code rejecting integer numbers?为什么python代码拒绝整数?
【发布时间】:2018-07-08 18:24:46
【问题描述】:

我写了一个代码

import re
inp=input("Please enter the file name ")
if len(inp)<1: inp = 'regex_sum_109744.txt'
fh=open(inp,'r')
sum=c=0
for i in fh:
    i=i.rstrip()
    s=re.findall('[0-9]+',i)
    for j in s:
        try:
            u=float(s[c])
        except:
            #print("the thing is",j)
            continue
        sum=sum+u
        #print("**********","the number is ",u,"the sum is ",sum,"************")
        c=c+1
    c=0
print(sum)

但是当我将 [0-9] 更改为 [0-9.] 时,输出开始拒绝整数

i have uploaded an image in which you can see that along with dot(.) the integers 3 and 4 are also rejected

谁能解释一下为什么会这样?

【问题讨论】:

  • 注意 [0-9.]+ 将匹配 1+ 个数字和点。
  • s[c] 是什么...?这个u=float(s[c]) 应该是u=float(j)c 已经过时了
  • 如果取消注释 except 块中的 print 行,哪些字符串会导致异常?匹配所有数字和点将匹配一些非数字值,例如点本身(可能是文本中的句点,而不是小数点)。
  • 使用(?:\d+(?:\.\d*)?|\.\d+)
  • 当我使用 [0-9.]+ 时,如您所见,我在 except 块中放置了一个打印语句以查看将被拒绝的内容,程序也拒绝整数和点。

标签: python regex python-3.x


【解决方案1】:

您的问题与您尝试将s[c] 转换为浮点数有关,但如果无法完成,您永远不会增加c(您在到达@ 之前continue 987654324@ 线)。这意味着在第一个匹配失败后,您将继续尝试相同的s[c] 用于内部循环的其余部分,并继续失败。因此,您永远不会匹配在一段时间后出现在一行上的数字。错误报告对您没有帮助,因为它会打印 j,它仍会随着循环运行而更新。

当您已经对s 列表中的值进行了for 循环时,我完全不清楚为什么要执行s[c]c=c+1。只需尝试转换j 而不是s[c],它应该可以工作(然后您可以从您的代码中完全删除c)。您也可以将c=c+1 行的副本放在except 块中,但我真的不建议这样做。实际上,我建议您将except 缩小一点,以便您只处理ValueError 异常,或者甚至使用与文本中的句点不匹配的更复杂的正则表达式,所以您不要完全需要try/except

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2014-09-02
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多