私は自分で「検索」プロシージャを作成したいと考えています。これは、文字列内の部分文字列を見つけることができ、文字列を逆方向に読み取って一致の位置を与えることもできます-Python の元の検索機能と同じです。
どのロジックを使用すればよいかわかりません。また、元の検索機能がどのように機能するのかもわかりません。
私はPythonを使い始めたばかりで、プログラミングもかなり初心者です。
どんなガイダンスでも大歓迎です!
私は自分で「検索」プロシージャを作成したいと考えています。これは、文字列内の部分文字列を見つけることができ、文字列を逆方向に読み取って一致の位置を与えることもできます-Python の元の検索機能と同じです。
どのロジックを使用すればよいかわかりません。また、元の検索機能がどのように機能するのかもわかりません。
私はPythonを使い始めたばかりで、プログラミングもかなり初心者です。
どんなガイダンスでも大歓迎です!
また、元の検索機能がどのように機能するのかわかりません
グーグルを使わずに関数について学ぶ良い方法は、Ipython、特にノートブック バリアントを使用することです。これらを使用すると、インタラクティブに 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
疑問符を 2 つ入力すると、ソース コードが表示されます
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 がどのように機能したかを正確に知るために、うさぎの穴をさらに下る必要があります。
この問題には簡単な解決策がありますが、単純なバージョンを実装した後に検討した方がよい、はるかに高速な解決策もあります。やりたいことは、検索している文字列の各位置をチェックし、検索している文字列がそこから始まるかどうかを確認することです。これは非効率的ですが、ほとんどの目的には十分に機能します。これに慣れている場合は、Boyer-Moore 文字列検索を検討することをお勧めします。Boyer-Moore 文字列検索は、はるかに複雑なソリューションですが、より効率的です。文字列が特定のポイントで開始しない場合、他の位置のいくつかをチェックする必要がない可能性があると判断できるという事実を利用しています。
スティーブは次のような意味だと思います。
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
andよりも単純です。str.rfind
start
end
'mystring'.rindex('my_substring')
これは、右側から始まる部分文字列の最初の位置を返します
'mystring'.index('my_substring')
同じことを行いますが、左側から文字列の検索を開始します。
これは、リスト内のすべてのヒントを返すソリューションであり、元のキーワード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]