我正在构建一些代码来修剪字符串开头和结尾的任何非数字条目,我对下面的代码有一个非常混乱的问题:
def String_Trim(Raw_String):
if Raw_String[0].isdigit() == False:
New_String = Raw_String[1:]
String_Trim(New_String)
elif Raw_String[-1].isdigit() == False:
New_String = Raw_String[:-1]
String_Trim(New_String)
else:
print Raw_String
return Raw_String
print(String_Trim('ab19fsd'))
Raw_String的初始打印工作正常并显示我想要的值(19),但由于某种原因,尝试打印String_Trim返回值的最后一行返回None。 python究竟在这做什么,我该如何解决?关于改进我的代码的任何其他意见也将非常感激。
答案 0 :(得分:3)
使用正则表达式。修剪字符串的递归确实不是一个好主意:
import re
def trim_string(string):
return re.sub(r'^([^0-9]+)(.*?)([^0-9]+)$', r'\2', string)
要将其分解,正则表达式(r'^([^0-9]+)(.*?)([^0-9]+)$'
)是这样的:
^
匹配字符串的开头。([^0-9]+)
匹配一组连续的非数字字符。(.*?)
匹配一组东西(非贪婪)。([^0-9]+)
匹配另一组连续的非数字字符。$
匹配字符串的结尾。替换字符串r'\2'
,只是说匹配字符串只替换第二组,这是两组非数字字符之间的东西。
但是,如果你确实确定要使用现有的解决方案,那么你需要了解递归实际上是如何工作的。当您调用return foo
时,该函数返回foo
作为其输出。如果您不致电return
,则会自动返回None
。
话虽如此,在递归过程的每种情况下都需要return
,而不仅仅是在最后:
def String_Trim(Raw_String):
if Raw_String[0].isdigit() == False:
New_String = Raw_String[1:]
return String_Trim(New_String)
elif Raw_String[-1].isdigit() == False:
New_String = Raw_String[:-1]
return String_Trim(New_String)
else:
print Raw_String
return Raw_String
答案 1 :(得分:1)
您只在StringTrim
内的一个案例中返回一个值。在递归调用前添加return
:
return String_Trim(New_String)
那应该解决它。
答案 2 :(得分:1)
如果我正确理解你的问题,你只想返回字符串中的数字;因为“从开头到结尾的任何非数字的修剪”对我来说听起来像“仅返回数字”。
如果这是正确的,你可以这样做:
''.join(a for a in 'abc19def' if a.isdigit())