查找最短子串

3 投票
2 回答
3157 浏览
提问于 2025-04-15 11:16

我写了一段代码,用来从一个字符串中找出子字符串。它会打印出所有的子字符串。

但是我想要的是长度在2到6之间的子字符串,并且只打印出最短的那个子字符串。

请帮帮我。

程序:

import re
p=re.compile('S(.+?)N')
s='ASDFANSAAAAAFGNDASMPRKYN'
s1=p.findall(s)
print s1

输出:

['DFA', 'AAAAAFG', 'MPRKY']  

期望的输出:

'DFA'  length=3

2 个回答

4

这个正则表达式 'S(.{2,6}?)N' 只会匹配长度在2到6个字符之间的内容。

如果你想得到最短的匹配结果,可以用 sorted(s1, key=len)[0]

完整的例子:

import re
p=re.compile('S(.{2,6}?)N')
s='ASDFANSAAAAAFGNDASMPRKYNSAAN'
s1=p.findall(s)
if s1:
    print sorted(s1, key=len)[0]
    print min(s1, key=len) # as suggested by Nick Presta

这个方法是通过先把 findall 返回的列表按长度排序,然后取排序后列表中的第一个项目。

补充:Nick Presta的回答更简洁,我之前不知道 min 也可以带 key 参数……

9

如果你已经有了一个列表,可以使用 min 函数,配合 len 函数作为第二个参数。

>>> s1 = ['DFA', 'AAAAAFG', 'MPRKY']
>>> min(s1, key=len)
'DFA'

编辑:
如果有两个元素长度相同,你可以进一步扩展这个方法,生成一个包含所有相同长度元素的列表:

>>> s2 = ['foo', 'bar', 'baz', 'spam', 'eggs', 'knight']
>>> s2_min_len = len(min(s2, key=len))
>>> [e for e in s2 if len(e) is s2_min_len]
['foo', 'bar', 'baz']

上面的内容在只有一个“最短”元素的情况下也应该能正常工作。

编辑 2: 为了更完整,经过我简单的测试,计算最短元素的长度并在列表推导式中使用这个长度,应该会更快。上面的内容已更新。

撰写回答