如何使用递归提取某个子字符串?

时间:2019-04-24 15:13:08

标签: python

我正在尝试编写一个方法,该方法需要一个由两部分组成的子字符串:

name: idnumber

是的,名称和ID由冒号(:)分隔,例如:

A:1313
B:4141

该方法的第一个示例应返回A,第二个示例应返回B,但它也应接受特殊情况,例如:

A$%#@$@#!__231:2 
A:::$@$@:::!$@:4

上面的代码应在第一行返回A$%#@$@#!__231,在第二行返回A:::$@$@:::!$@

我试图递归地执行此操作,这是我的代码:

j=0
def name(input):
  global j
  item = ''
  item = input[j:]
  if ':' in item:
    return name(input[j+1:])
  else:
    return input[:j - 1]

此代码不返回任何内容,我不确定为什么它不起作用。

感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

听起来像rpartition()的工作:

input = ["A:1313",
         "B:4141",
         "A$%#@$@#!__231:2",
         "A:::$@$@:::!$@:4",
        ]

for item in input:
    print(item.rpartition(":")[0])

礼物:

A
B
A$%#@$@#!__231
A:::$@$@:::!$@

答案 1 :(得分:0)

在您的代码中,不需要'j'


这符合您的要求

r = 'A:::$@$@:::!$@:4'
pos = r.rfind(':') #https://stackoverflow.com/questions/9572490
print(r[:pos])

答案 2 :(得分:0)

我将通过拆分连接组合来实现,即如下:

example1 = 'A$%#@$@#!__231:2'
example2 = 'A:::$@$@:::!$@:4'
def getname(x):
    return ':'.join(x.split(':')[:-1])
print(getname(example1)) # A$%#@$@#!__231
print(getname(example2)) # A:::$@$@:::!$@
我创建的

函数获取字符串,在:处将其分割,丢弃最后一个元素(在您的情况下为 idnumber ),然后将其与:结合在一起。请注意,如果输入中没有str,它将返回空的:

答案 3 :(得分:0)

您可以简单地忽略带有多个冒号的值,然后像往常一样使用split()方法:

def splitter(id_strings = []):
  return [id if "::" in id else id.split(":")[0] for id in id_strings]

您还可以将其转换为lambda方法:

splitter = lambda id_strings = []: [id if "::" in id else id.split(":")[0] for id in id_strings]

splitter()方法的用法:

print(splitter(["A:1313", "B:1414", "A$%#@$@#!__231", "A:::$@$@:::!$@"]))

两种方法的预期输出:

["A", "B", "A$%#@$@#!__231", "A:::$@$@:::!$@"]

祝你好运。

答案 4 :(得分:0)

在搜索中使用正则表达式

import re
samples=["A$%#@$@#!__231:2","A:::$@$@:::!$@:4","A:1313","B:4141"]
res=[ re.search("((.*( by )?.*):(.*))",s).group(2,4) for s in samples]
print(res)

您会收到(key, value)字典

[('A$%#@$@#!__231', '2'), ('A:::$@$@:::!$@', '4'), ('A', '1313'), ('B', '4141')]

回复:https://repl.it/@loretoparisi/How-do-I-extract-a-certain-substring-using-recursion