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'、一致した文字列を 2 番目のグループ (数字以外の文字の 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 に答える