3

我编写了一个代码来从字符串中查找子字符串。它打印所有子字符串。但我想要一个长度为 2 到 6 的子字符串并打印最小长度的子字符串。请帮我

程序:

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

输出:

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

期望的输出:

'DFA'  length=3
4

2 回答 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']

当只有 1 个“最短”元素时,上述内容也应该有效。

编辑2:为了完整起见,至少根据我的简单测试,计算最短元素的长度并在列表理解中使用它应该更快。以上更新。

于 2009-04-27T06:24:32.530 回答
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按长度对返回的列表进行排序,然后返回排序列表中的第一项来工作。

编辑:尼克普雷斯塔的回答更优雅,我不知道min也可以key争论......

于 2009-04-27T06:13:47.330 回答