【问题标题】:How do I ensure that a string will return properly in python?如何确保字符串在 python 中正确返回?
【发布时间】:2012-05-06 08:10:26
【问题描述】:

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

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

【问题讨论】:

  • 请查看python.org/dev/peps/pep-0008 - 它建议使用不同的命名风格(小写_带下划线),您应该避免使用== True 和´== False´(它们不是必需的,if foo 和@ 987654325@ 是检查布尔值真/假的正确方法)

标签: python data-structures return return-type


【解决方案1】:

为此使用正则表达式。修剪字符串的递归确实不是一个好主意:

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

【讨论】:

  • 为什么递归修剪字符串如此糟糕?
  • @SlaterTyranus:如果有很多字符需要修剪,你可能会得到堆栈溢出异常。
  • @Shep:不仅在 Python 中很慢 - 在几乎所有具有不可变字符串的语言中都很慢。一次删除一个字符会创建许多新字符串,每次都复制字符串的内容。
  • 这很有意义,感谢您的反馈,但我仍然不清楚为什么原始代码不起作用。另外,感谢正则表达式的解释。
  • 正则表达式的使用不是一种特权,它应该是最后的手段。 Raw_String.strip('abcdefghijklmnopqrstuvwxyz') 更干净。
【解决方案2】:

您在StringTrim 内仅返回一个值。在递归调用前添加return

        return String_Trim(New_String)

这应该可以解决问题。

【讨论】:

  • 试过了,但遗憾的是它仍然返回 Nones
  • 现在了解并实施,谢谢。由于代码的更改而没有实际意义,但对于提高我的编码能力仍然有用。
  • 它不返回无;考虑到问题不是要求递归解决方案的替代方法,而是询问为什么递归解决方案不起作用,这是正确的答案。
【解决方案3】:

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

如果正确,您可以这样做:

''.join(a for a in 'abc19def' if a.isdigit())

【讨论】:

  • 这将去除字符串中被数字包围的非数字。我不确定这是否只是问题中的一个错字,但 OP 特别需要一个从字符串两侧去除非数字的解决方案。
  • 你说得有道理,但你怎么知道一个字符串有多长?或者就此而言,“开始”和“结束”是什么。读完这个and displays the value that I want (19) 后,我想我会把它扔掉。
  • Blender 是正确的,这基本上是为了在遗传算法中丢弃无用的信息,所以这很遗憾行不通。不过还是谢谢。
  • @BurhanKhalid:字符串理论与 Python 中的字符串对象有什么关系?
  • @Blender - 错误 .. 抱歉,粘贴错误。已编辑。
猜你喜欢
  • 2014-07-15
  • 2020-12-10
  • 2014-06-14
  • 2017-03-02
  • 2016-08-21
  • 1970-01-01
  • 2017-04-05
  • 2012-08-30
  • 1970-01-01
相关资源
最近更新 更多