可以說我有這個字串:
a = 'ashf af hkiojojojhoh kh giobbboddbbgoifb af jgibibfoobfbobobfbafnongo kh ofgoon'
我的目標是創建一個函式,讓我獲得任何以“af”開頭并以“kh”結尾的子字串。在這個例子中,我會得到 2 個子字串
- 'afhkiojojojhohkh' 和 'afjgibibfoobfbobobfbafnongokh'
我還想獲得這些子字串的長度及其在較大字串中的位置。
我曾考慮過使用 for 回圈,但我并沒有走得太遠。很感謝任何形式的幫助。
謝謝。
uj5u.com熱心網友回復:
re使用正則運算式的內置模塊:
import re
text = 'ashfafhkiojojojhohkhgiobbboddbbgoifbafjgibibfoobfbobobfbafnongokhofgoon'
# tuples of the form (substr, (start, end), length)
matches = [(match.group(0), match.span(), int.__rsub__(*match.span()),) for match in re.finditer(r'(af.*?kh)', text)]
longest = max(matches, key=lambda pairs: pairs[-1])
print(matches)
print(longest)
編輯
如果:=支持,串列理解中的術語可以像這樣簡化
(match.group(0), pos:=match.span(), int.__rsub__(*pos))
uj5u.com熱心網友回復:
您可以使用嵌套搜索來查找startand end:
具有動態start和end(您可以更改開始和結束值)的完整函式如下所示:
def find(inp, start, end):
ls = len(start)
le = len(end)
start_and_len = []
for i in range(len(inp)-ls 1):
if inp[i:i ls] == start:
for j in range(i, len(inp)-le 1):
if inp[j:j le] == end:
# (str, start index, len)
start_and_len.append((inp[i:j le], i, j le-i,))
return start_and_len
# Use as
>>> a = 'afafaf---khkhkh'
>>> find(a, 'af', 'kh')
[('afafaf---kh', 0, 11),
('afafaf---khkh', 0, 13),
('afafaf---khkhkh', 0, 15),
('afaf---kh', 2, 9),
('afaf---khkh', 2, 11),
('afaf---khkhkh', 2, 13),
('af---kh', 4, 7),
('af---khkh', 4, 9),
('af---khkhkh', 4, 11)]
# Your given example, with more matches
>>> a = 'ashfafhkiojojojhohkhgiobbboddbbgoifbafjgibibfoobfbobobfbafnongokhofgoon'
>>> find(a, 'af', 'kh')
[('afhkiojojojhohkh', 4, 16),
('afhkiojojojhohkhgiobbboddbbgoifbafjgibibfoobfbobobfbafnongokh', 4, 61),
('afjgibibfoobfbobobfbafnongokh', 36, 29),
('afnongokh', 56, 9)]
uj5u.com熱心網友回復:
我能夠修改@cards 的答案并提出以下函式來回答我上面的問題。
import re
a = 'ashfafhkiojojojhohkhgiobbboddbbgoifbafjgibibfoobfbobobfbafnongokhofgoon'
def substring(string, start, end):
matches = [(match.group(0), match.span(), int.__rsub__(*match.span()),) for match in re.finditer(rf'({start}.*?{end})', string)]
return matches
substring(a, 'af', 'kh')
[('afhkiojojojhohkh', (4, 20), 16),
('afjgibibfoobfbobobfbafnongokh', (36, 65), 29)]
如果有人可以使用 for 回圈提出相同的答案,請隨時發布。感謝大家的幫助!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/464577.html
