如何确保字符串在python中正确返回?

时间:2012-05-06 08:10:26

标签: python data-structures return return-type

我正在构建一些代码来修剪字符串开头和结尾的任何非数字条目,我对下面的代码有一个非常混乱的问题:

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究竟在这做什么,我该如何解决?关于改进我的代码的任何其他意见也将非常感激。

3 个答案:

答案 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())