将函数从php转换为python

2024-04-27 02:45:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图转换这个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函数,但是没有按预期工作。在

^{pr2}$

我做错什么了?任何建议都将不胜感激。在


Tags: 函数iffunctionseekerrorargumentarrayphp
3条回答

这对我有用:

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或者让函数抛出一个执行错误。在

警告

  1. 当无法定位针时,strrpos和{}返回的值不相同。在php中strrpos返回false,而python的string.rfind返回-1

  2. php版本中的while conditional没有使用严格的比较,因此如果在结果数组中找到指针,则函数不会将偏移量0存储在结果数组中,要解决此问题,代码应该编写为:

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


问题的根源….

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

上面两行没有提供等价的功能,php条件相当于写:

^{pr2}$

我将您的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]

一些小变化:

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

相关问题 更多 >