3

我希望自己创建一个“查找”程序它能够在字符串中查找子字符串,并且它还应该能够向后读取字符串并给出匹配的位置——就像 python 中的原始查找函数一样。

我无法弄清楚我应该使用什么逻辑 - 我也不知道原来的 find 功能如何?

我刚开始使用 python,对编程也很陌生。

任何指导将不胜感激!

4

5 回答 5

3

我也不知道原来的 find 功能如何

无需谷歌搜索即可了解函数的一个好方法是使用Ipython,尤其是notebook 变体。这些允许您以交互方式编写 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

然后,您需要进一步深入兔子洞,以确切了解 find 的工作原理。

于 2013-04-18T20:34:25.283 回答
1

这个问题有一个简单的解决方案,但也有更快的解决方案,您可能希望在实现简单版本后查看这些解决方案。您要做的是检查您正在搜索的字符串中的每个位置,并查看您正在搜索的字符串是否从那里开始。这是低效的,但对于大多数用途来说效果很好,如果您对此感到满意,那么您可能需要查看 Boyer-Moore 字符串搜索,这是一个更复杂但更有效的解决方案。它利用了这样一个事实,即您可以确定如果字符串不是从某个点开始,您可能不需要检查其他一些位置。

于 2013-04-18T20:19:09.317 回答
1

我认为史蒂夫的意思是这样的:

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.findstr.rfind因为您不能提供startend参数。

于 2013-04-18T21:38:41.907 回答
1

这是一个返回列表中所有提示的解决方案,并rfind使用 originalfind关键字定义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]
于 2013-04-18T20:47:18.380 回答
1
'mystring'.rindex('my_substring')

这将返回子字符串的第一个位置,从右侧开始

'mystring'.index('my_substring')

做同样的事情,但从左侧开始搜索字符串。

于 2013-04-18T21:45:08.537 回答