我希望创建一个'find'程序我自己,它能够在字符串中找到一个子字符串,它也应该能够向后读取一个字符串并给出匹配的位置 - 就像python中的原始find函数一样。
我无法弄清楚我应该使用什么逻辑 - 我也不知道原始查找功能如何?
我刚刚开始使用python,对于编程也是一个新手。
任何指导都应该受到高度赞赏!
答案 0 :(得分:3)
我也不知道原始查找功能
在没有Google搜索的情况下学习函数的好方法是使用Ipython,尤其是notebook variant。这些允许您以交互方式编写python代码,并具有一些特殊功能。在带有问号的Ipython(笔记本或解释器)中键入函数的名称会返回有关函数的一些信息,例如
find?
Type: function
String Form:<function find at 0x2893cf8>
File: /usr/lib/pymodules/python2.7/matplotlib/mlab.py
Definition: find(condition)
Docstring: Return the indices where ravel(condition) is true
键入两个问号会显示源代码
find??
Type: function
String Form:<function find at 0x2893cf8>
File: /usr/lib/pymodules/python2.7/matplotlib/mlab.py
Definition: find(condition)
Source:
def find(condition):
"Return the indices where ravel(condition) is true"
res, = np.nonzero(np.ravel(condition))
return res
然后你需要进一步沿着兔子洞去找到确切的工作方式。
答案 1 :(得分:1)
这个问题有一个简单的解决方案,但是在实现简单版本之后,您可能还需要考虑更快的解决方案。你想要做的是检查你正在搜索的字符串中的每个位置,看看你正在搜索的字符串是否从那里开始。这是效率低下的,但是对于大多数目的来说效果都不错,如果你对此感到满意,那么你可能想看看Boyer-Moore字符串搜索,这是一个更复杂的解决方案,但效率更高。它利用了这样一个事实,即你可以确定如果一个字符串没有从某一点开始,你可能不需要检查其他一些位置。
答案 2 :(得分:1)
以下是一个返回列表中所有提示的解决方案,rfind
是使用原始find
关键字backwards
定义的。您也可以使用整数或浮点数。您可以轻松修改它,以便仅返回第一个提示。
def find( x, string, backward = False, ignore_case = False ):
x = str(x)
string = str(string)
if ignore_case:
x = x.lower()
string = string.lower()
str_list = [ i for i in string ]
x_list = [ i for i in x ]
if backward:
x_list.reverse()
str_list.reverse()
x = ''.join(x_list)
string = ''.join(str_list)
lenx = len(x)
ans = []
for i in range( len(str_list) - lenx ):
if x == string[i:i+lenx]:
ans.append( i )
return ans
def rfind( x, string, ignore_case = False):
return find( x, string, backward = True, ignore_case = ignore_case )
print find('f','abcdefgacdfh')
# [5, 10]
print rfind('f','abcdefgacdfh')
# [1, 6]
print find(12,'aaa3331222aa12a')
# [6, 12]
print rfind(12,'aaa3331222aa12a')
# [1, 7]
答案 3 :(得分:1)
我认为Steve意味着:
def find(s, sub):
for i, _ in enumerate(s):
if s.startswith(sub, i):
return i
return -1
def rfind(s, sub):
for i in range(len(s)-1, -1, -1):
if s.startswith(sub, i):
return i
return -1
然而,这比常规str.find
和str.rfind
更简单,因为您无法提供start
和end
参数。
答案 4 :(得分:1)
'mystring'.rindex('my_substring')
这将从右侧开始返回子字符串的第一个位置
'mystring'.index('my_substring')
做同样的事情,但是从左侧开始搜索字符串。