文字列の開始インデックスと終了インデックスがある場合は、次のようにすることができます。
substring = string[s_ind:e_ind]
ここs_ind
で、は文字列に含めたい最初の文字のインデックスであり、は文字列に含めたくないe_ind
最初の文字のインデックスです。
例えば
string = "Long string of which I only want a small part"
# 012345678901234567890123456789012345678901234
# 0 1 2 3
substring = string[21:32]
print substring
プリントI only want
現在と同じ方法でインデックスを見つけることができます。
編集:効率に関しては、このタイプのソリューションは実際には正規表現ソリューションよりも効率的です。その理由は、必ずしも必要ではない正規表現に関連する多くのオーバーヘッドがあるためです。
人々が最も効率的であると主張することを盲目的に行うのではなく、自分でこれらのことをテストすることをお勧めします。
次のテストプログラムを検討してください。
#!/bin/env python
import re
import time
def inner_regex(s):
return re.sub(r'<[^>]*>', '', s)
def inner_substr(s):
s_ind = s.find('>') + 1
e_ind = s.find('<', s_ind)
return s[s_ind:e_ind]
s = '<stuff to remove> get this stuff <stuff to remove>'
tr1 = time.time()
for i in range(100000):
s1 = inner_regex(s)
tr2 = time.time()
print("Regex: %f" % (tr2 - tr1))
ts1 = time.time()
for i in range(100000):
s2 = inner_substr(s)
ts2 = time.time()
print("Substring: %f" % (ts2 - ts1))
出力は次のとおりです。
Regex: 0.511443
Substring: 0.148062
つまり、正規表現アプローチを使用すると、元の修正されたアプローチよりも3倍以上遅くなります。
編集:コンパイルされた正規表現に関するコメントに関しては、コンパイルされていない正規表現よりも高速ですが、明示的なサブストリングよりも低速です。
#!/bin/env python
import re
import time
def inner_regex(s):
return re.sub(r'<[^>]*>', '', s)
def inner_regex_compiled(s,r):
return r.sub('', s)
def inner_substr(s):
s_ind = s.find('>') + 1
e_ind = s.find('<', s_ind)
return s[s_ind:e_ind]
s = '<stuff to remove> get this stuff <stuff to remove>'
tr1 = time.time()
for i in range(100000):
s1 = inner_regex(s)
tr2 = time.time()
tc1 = time.time()
r = re.compile(r'<[^>]*>')
for i in range(100000):
s2 = inner_regex_compiled(s,r)
tc2 = time.time()
ts1 = time.time()
for i in range(100000):
s3 = inner_substr(s)
ts2 = time.time()
print("Regex: %f" % (tr2 - tr1))
print("Regex Compiled: %f" % (tc2 - tc1))
print("Substring: %f" % (ts2 - ts1))
戻り値:
Regex: 0.512799 # >3 times slower
Regex Compiled: 0.297863 # ~2 times slower
Substring: 0.144910
話の教訓:正規表現はツールボックスに含めると便利なツールですが、利用可能な場合は、より単純な方法ほど効率的ではありません。
そして、自分で簡単にテストできることについて、人々の言葉を信じないでください。