我正在尝试编写一个方法,该方法需要一个由两部分组成的子字符串:
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]
此代码不返回任何内容,我不确定为什么它不起作用。
感谢您的帮助。
答案 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