将函数从php转换为python

时间:2012-07-15 23:36:32

标签: php python function

我正在尝试转换此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)

我做错了什么?任何指针都将非常感激。

3 个答案:

答案 0 :(得分:3)

警告(S)

    当无法找到针时,
  1. strrposstring.rfind不会返回相同的值。在php strrpos中返回 false ,但python的string.rfind返回 -1

  2. php版本中的 while-conditional 不使用严格比较,因此如果针是针,函数将不会在结果数组中存储偏移量0在那里发现,为了解决这个问题,代码应该写成:

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


  3. 问题的根源..

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

    以上两行不提供等效功能,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]
    

答案 1 :(得分: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

答案 2 :(得分: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或让函数抛出执行错误。