-1

このphp関数を変換しようとしています

function strpos_r($haystack, $needle)
{
    if(strlen($needle) > strlen($haystack))
        trigger_error(sprintf("%s: length of argument 2 must be <= argument 1", __FUNCTION__), E_USER_WARNING);

    $seeks = array();
    while($seek = strrpos($haystack, $needle))
    {
        array_push($seeks, $seek);
        $haystack = substr($haystack, 0, $seek);
    }
    return $seeks;
}

このPython関数を作成しましたが、期待どおりに機能していません。

def strposR(haystack, needle):
    if strlen(needle) > strlen(haystack):
        sys.stderr.write("length of argument 2 must be <= argument 1")
    seeks = []
    seek = 0
    while seek == haystack.rfind(needle):
        seeks.append(seek)
        haystack = haystack[0:seek]
    return seeks
def strlen(x):
    return len(x)

私が間違っていることは何ですか?どんなポインタでも大歓迎です。

4

3 に答える 3

3

警告

  1. strrpos針が見つからない場合、同じ値をstring.rfind返しません。phpではfalsestrrposを返しますが、pythonでは-1を返します!string.rfind

  2. phpバージョンのwhile-conditionalは厳密な比較を使用しないため0、針が見つかった場合、関数は結果の配列にオフセットを格納しません。この問題を修正するには、コードを次のように記述する必要があります。

    while (($seek = strrpos ($haystack, $needle)) !== false)


あなたの問題の根源。

while($seek = strrpos($haystack, $needle)) # PHP
while seek == haystack.rfind(needle):      # python

上記の2行は同等の機能を提供していません。php-conditionは次のように記述した場合と同等です。

while (($seek = strrpos ($haystack, $needle)) != false) 

私はあなたのPythonループを次のように変更します:

while True:
  seek = haystack.rfind(needle)
 
  if seek == -1:
    break

  if seek ==  0: # because of mentioned bug in the php version
    break

  seeks.append(seek)
  haystack = haystack[0:seek]
于 2012-07-15T23:48:44.750 に答える
1

いくつかの小さな変更:

def strposR(haystack, needle):
    if len(needle) > len(haystack):
        sys.stderr.write("length of argument 2 must be <= argument 1")
    seeks = []
    seek = haystack.rfind(needle)
    while seek != -1:
        seeks.append(seek)
        haystack = haystack[0:seek]
        seek = haystack.rfind(needle)
    return seeks
于 2012-07-15T23:45:46.920 に答える
1

これは私のために働きます:

def strpos_r(haystack, needle):
    positions = []
    position = haystack.rfind(needle)

    while position != -1:
        positions.append(position)
        haystack = haystack[:position]
        position = haystack.rfind(needle)

    return positions

また、関数は実際には入力エラーを処理するべきではありません。通常はreturn False、関数に実行エラーをスローさせるか、実行させます。

于 2012-07-15T23:47:18.477 に答える