我正在尝试转换此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)
我做错了什么?任何指针都将非常感激。
答案 0 :(得分:3)
strrpos
和string.rfind
不会返回相同的值。在php strrpos
中返回 false ,但python的string.rfind
返回 -1 !
php版本中的 while-conditional 不使用严格比较,因此如果针是针,函数将不会在结果数组中存储偏移量0
在那里发现,为了解决这个问题,代码应该写成:
while (($seek = strrpos ($haystack, $needle)) !== false)
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
或让函数抛出执行错误。