寻找最短子串

3
我已经编写了一段代码来查找字符串中的子字符串,并打印出所有子字符串。 但我想要一个长度在2到6之间的子字符串,并打印出最小长度的子字符串。 请帮助我。
程序:
import re
p=re.compile('S(.+?)N')
s='ASDFANSAAAAAFGNDASMPRKYN'
s1=p.findall(s)
print s1

输出:

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

期望的输出:

'DFA'  length=3

如果有多个最小长度的字符串怎么办? - mhawke
1
我不知道你在输入方面有什么限制,但是你必须小心正则表达式。例如,对于字符串“SASANSAAN”,你的正则表达式将返回['ASA','AA'],而你期望的输出可能只是'A'(在'SAN'中)。 - Miles
2个回答

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: 为了完整起见,根据我的简单测试,计算最短元素的长度并在列表推导式中使用应该更快。已更新以上内容。


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参数...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接