有個字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符、數字和字母,輸出最長的子字符串和他的長度
例如上面的字符串同時包含數字和字母的字符串是svda123,長度是7
代碼實現如下:
方法1:
str_scr = '$sd1#111$svda123!!!221&eSSDSDG^svda121^svda124^' # 下面這種思路是這樣的: # 遍歷字符串的元素,如果元素不是字母或者數字,則添加‘.’進list, # 如果該元素是字母或者數字,則把該元素添加進list # 然后,再把list轉換為字符串 # 再把轉換后的字符串以‘.’號分割成一個新的list(這時候list中的元素就是一個個僅包含數字或字母字符串) # 遍歷這個新的list中的元素,如果該元素不為空且同時包含數字和字母,則把該元素添加進list a中,同時把該元素的長度添加進list b 中 # 用下標遍歷存儲長度的list b ,如果元素的長度等於list b中最大元素的長度,則該元素就是符合條件的最長子字符串了,同時獲得了該元素的下標 # 最后再用下標去list a 中取子字符串,並把結果存儲在list lg中 # 程序結束,lg中的元素就是所有符合條件的子字符串了 def find_sonstr_lis(s): ls = [] for i in range(len(s)): if not s[i].isalnum(): ls.append('.') else: ls.append(s[i]) s = ''.join(ls) ls = s.split('.') a = [] # 字符串 b = [] # 長度 lg = [] # 最長字符串 for x in ls: x = x.strip() if len(x) > 0 and not x.isalpha() and not x.isdigit(): a.append(x) b.append(len(x)) if len(b)>0: for n in range(len(b)): if b[n] == max(b): lg.append(a[n]) return "最長子字符串為:{sun_scr} 長度為:{long}".format(sun_scr=lg, long=max(b)) else: return "同時包含字母和數字的子字符串不存在" print(find_sonstr_lis(str_scr))
方法2:
# 根據上面的思路,我們也可以考慮另一種實現方式 # 上面是把字符串元素一個個遍歷進一個list中,把非數字或字母的元素以‘.’號代替,再把list轉換為字符串 # 那么其實可以不用這么麻煩,直接在字符串中替換就行了,思路是這樣的: # 遍歷字符串元素,如果該元素不是數字或字母,則以'.'號替換字符串中的元素,從而得到一個僅包含數字、字母和'.'號的字符串 # 接下來就跟上面一樣了,分割字符串,存儲子字符串和長度,找出最大長度的子字符串即可 def find_sonstr_replace(s): for i in s: if not i.isalnum(): s = s.replace(i, '.') ls = s.split('.') a = [] b = [] lg = [] for x in ls: x = x.strip() if len(x)> 0 and not x.isdigit() and not x.isalpha(): a.append(x) b.append(len(x)) if len(b)>0: for n in range(len(b)): if b[n] == max(b): lg.append(a[n]) return "最長子字符串為:{sun_scr} 長度為:{long}".format(sun_scr=lg, long=max(b)) else: return "同時包含字母和數字的子字符串不存在" print(find_sonstr_replace(str_scr))
方法3:
# 還有另外一種寫法就是應用正則表達式,直接匹配出符合條件的子字符串調用findall()函數找出這些字符串並存入ls中,代碼如下: def find_sonstr_refindall(s,): import re lg = [] # 最長子字符串 b = [] pattern = re.compile(r'[A-Za-z]+[0-9]+[^%#*&\',;=?!\$\+\-\·\^\.\x22]*') ls = re.findall(pattern,s) for i in ls: b.append(len(i)) if len(b)>0: for x in range(len(b)): if b[x] == max(b): lg.append(ls[x]) return "最長子字符串為:{sun_scr} 長度為:{long}".format(sun_scr=lg, long=max(b)) else: return "同時包含字母和數字的子字符串不存在" print(find_sonstr_refindall(str_scr))
方法4:
# 這種檢索字符串的時候,使用正則表達式是很靈活的,下面這種方式實現起來就更簡單了 # 直接 把字符串按非數字或字母分割,返回一個list 這時候list內的結果就是僅包含數字或字母的字符串了 def find_sonstr_resplit(s): import re ls = re.split(r'\W',s) a,b,lg = [],[],[] for i in ls: if len(i)>0 and not i.isdigit() and not i.isalpha(): a.append(i) b.append(len(i)) if len(b)>0: for x in range(len(b)): if b[x] == max(b): lg.append(a[x]) return "最長子字符串為:{sun_scr} 長度為:{long}".format(sun_scr=lg, long=max(b)) else: return "同時包含字母和數字的子字符串不存在" print(find_sonstr_resplit(str_scr))
四種方法運行結果:
最長子字符串為:['svda123', 'svda121', 'svda124'] 長度為:7 最長子字符串為:['svda123', 'svda121', 'svda124'] 長度為:7 最長子字符串為:['svda123', 'svda121', 'svda124'] 長度為:7 最長子字符串為:['svda123', 'svda121', 'svda124'] 長度為:7 Process finished with exit code 0