从字符串中提取 2 位数字

Extracting 2 digits numbers from string

提问人:archerwell32 提问时间:11/27/2022 最后编辑:archerwell32 更新时间:11/27/2022 访问量:111

问:

我有一个包含字符串的文件,从我需要将每个字符串附加到我的列表中,每 2 位数字。文件内容如下: https://pastebin.com/N6gHRaVA

我需要遍历每个字符串并检查 index[i] 和 index[i+1] 上的字符串是否为数字,如果是,则附加这些数字以列出并从这 2 位数字中切分字符串,

例如,字符串:

string = '7469NMPLWX8384RXXOORHKLYBTVVXKKSRWEITLOCWNHNOAQIXO' 应该以这种方式工作:

  1. 好的,我找到了数字 74,将 74 添加到我的列表中,然后将字符串从 74 切到末尾
  2. 我的字符串现在是 69NMPLWX8384RXXOORHKLYBTVVXKKSRWEITLOCWNHNOAQIXO,我找到了数字 69,添加 69 以列出并切片字符串,直到我找到新的 2 位数字。 问题是我总是有错误:
        if string[i].isdigit() and string[i+1].isdigit():
                               ~~~~~~^^^^^
IndexError: string index out of range
f = open("file.txt")
read = f.read().split()
f.close()
for string in read:
    l = list()
    i = 0
    print(string)
    while i<len(string):
        if string[i].isdigit() and string[i+1].isdigit():
            l.append(string[i] + string[i+1])
            string = string[i+2:]
            i = 0
        else:
            i+=1

我的程序在第 31 行的字符串处停止,这是字符串: “REDOHGMDPOXKFMHUDDOMLDYFAFYDLMODDUHMFKXOPDMGHODER5”

我不知道如何进行这个切片迭代,请不要使用正则表达式。

Python 字符串 列表 循环 切片

评论

0赞 ScottC 11/27/2022
你为什么不想使用正则表达式?
0赞 archerwell32 11/27/2022
这是我不能使用外部库的练习

答:

0赞 Ni3dzwi3dz 11/27/2022 #1

你的循环条件 i len(string)。如果 string 不为空,则等于正 intiger,其计算结果为 True。因此,您创建了一个无限循环,当 i 大于字符串长度时,它达到了它的结尾。试试这个:

while i < len(string) -1:

编辑:
显然,我没有注意到哪个字符串给了你错误。当您检查字符串的 i+1 元素时,当我们为最后一个字符加星标时,伸手去拿下一个字符会产生明显的错误。因此,条件中应该有 -1。

1赞 GaryMBloom 11/27/2022 #2

你要离开了绳子的尽头......改变:

 while i<len(string):

自:

 while i<len(string)-1:

你应该没事的。

如果您一次只看一个字符,则可以使用原始 .这里的诀窍是,你总是在看一个字符,而且在字符的“前面”。因此,您必须将检查缩短一次迭代,以防止超过要检查的最后一个字符。while

0赞 ScottC 11/27/2022 #3

您可以使用递归。 这是处理其中一个字符串的样子。

部分代码

my_string = '7469NMPLWX8384RXXOORHKLYBTVVXKKSRWEITLOCWNHNOAQIXO'
result_list = []

def read_string(s):
    result = ""
    for i,j in enumerate(s):
        if i>0 and s[i-1].isdigit() and s[i].isdigit():
            result = s[i-1] + s[i]
            result_list.append(result)
            read_string(s[i+1:])
            break;
            
    return (result_list)        
     
# Call the read_string function
x = read_string(my_string) 
print(x)    

输出:

['74', '69', '83', '84']
0赞 Michael Gathara 11/27/2022 #4

你没有停在正确的位置。你可以把你的while循环改成

while I < len(string) - 1:

如果我可以建议一种稍微干净的方法,请参见下文。

f = open("file.txt")
read = f.read().split()
f.close()
for string in read:
    l = list()
    i = 0
    print(string)
    while i < len(string) - 1:
        numCheck = i + 1 # You call it more than once. Set to var
        ltr = string[i] + string[numCheck] # no need to call this multiple times, just set to a var
        if ltr.isdigit():
            l.append(ltr)
            string = string[numCheck:]
            i = 0
        else:
            i += 1
        
print(l)

我把你的while循环改为上面,然后把你多次进行的调用放到一个变量中。此外,由于您的列表是在 for 循环中初始化的,因此如果您想要一个包含所有数字的列表,您只需保留最后一个字符串中的数字,只需将其移出即可。这样

f = open("file.txt")
read = f.read().split()
f.close()
l = list()
for string in read:
    i = 0
    print(string)
    while i < len(string) - 1:
        numCheck = i + 1 # You call it more than once. Set to var
        ltr = string[i] + string[numCheck] # no need to call this multiple times, just set to a var
        if ltr.isdigit():
            l.append(ltr)
            string = string[numCheck:]
            i = 0
        else:
            i += 1
        
print(l)