python 查找字符串同時包含數字和字母的最長子字符串的幾種實現方法


有個字符串$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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM