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

 

 

posted @ 2017-10-26 15:37  真的,秋风来了  阅读(6157)  评论(1编辑  收藏  举报