我想創建一個函數來檢查字符串中是否存在其他字符串。
但是,正在檢查的子字符串可能會在主字符串中被其他字母打斷。在字符串中查找字符串的子序列
例如:
a = 'abcde'
b = 'ace'
c = 'acb'
有問題的函數應該返回爲b
正在a
,但不c
。我試過set(a)
。已經設置了交集(set(b)),我的問題是它返回c
,因爲它在a
中。
我想創建一個函數來檢查字符串中是否存在其他字符串。
但是,正在檢查的子字符串可能會在主字符串中被其他字母打斷。在字符串中查找字符串的子序列
例如:
a = 'abcde'
b = 'ace'
c = 'acb'
有問題的函數應該返回爲b
正在a
,但不c
。我試過set(a)
。已經設置了交集(set(b)),我的問題是它返回c
,因爲它在a
中。
你可以把你的預期序列爲正則表達式:
import re
def sequence_in(s1, s2):
"""Does `s1` appear in sequence in `s2`?"""
pat = ".*".join(s1)
if re.search(pat, s2):
return True
return False
# or, more compactly:
def sequence_in(s1, s2):
"""Does `s1` appear in sequence in `s2`?"""
return bool(re.search(".*".join(s1), s2))
a = 'abcde'
b = 'ace'
c = 'acb'
assert sequence_in(b, a)
assert not sequence_in(c, a)
「王牌」被變成了正則表達式。「一* C * E」,它發現在序列這三個字符,可能介入字符。
感謝您的及時答覆! – 2010-09-09 03:05:49
如何對這樣的事情...
def issubstr(substr, mystr, start_index=0):
try:
for letter in substr:
start_index = mystr.index(letter, start_index) + 1
return True
except: return False
或...
def issubstr(substr, mystr, start_index=0):
for letter in substr:
start_index = mystr.find(letter, start_index) + 1
if start_index == 0: return False
return True
我預計這會比基於正則表達式的答案運行得更快。你有時間嗎? – 2010-09-09 04:19:03
不是沒有時機,只是寫它作爲替代。 – 2010-09-09 04:24:53
def issubstr(s1, s2):
return "".join(x for x in s2 if x in s1) == s1
>>> issubstr('ace', 'abcde')
True
>>> issubstr('acb', 'abcde')
False
請說明空白的意見。 – 2010-09-09 15:47:41
問題是要找到子序列,而不是子串 – gizmo 2012-11-09 07:00:25
這些類型的字符串分別被稱爲子序列(HTTP://en.wikipedia。 org/wiki/Subsequence)更長的字符串。 – Lazer 2010-09-11 12:59:13
這個問題是一個特例http://stackoverflow.com/questions/6877249/find-the-number-of-occurrences-of-a-subsequence-in-a-string那裏的解決方案更有效地解決這種情況也是如此。 – Amoss 2014-04-06 08:42:43