0

我正在构建一些代码,它会从字符串的开头和结尾删除任何非数字条目,我对以下代码有一个非常令人困惑的问题:

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到底在做什么,我该如何解决?任何其他关于改进我的代码的评论也将不胜感激。

4

3 回答 3

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
于 2012-05-06T08:14:42.380 回答
1

您仅在内部的一种情况下返回一个值StringTrimreturn在递归调用前面添加:

        return String_Trim(New_String)

那应该解决它。

于 2012-05-06T08:20:39.783 回答
1

如果我正确理解您的问题,您只想返回字符串中的数字;因为“从头到尾修剪任何非数字”对我来说听起来像“只返回数字”。

如果这是正确的,你可以这样做:

''.join(a for a in 'abc19def' if a.isdigit())
于 2012-05-06T08:26:21.230 回答