查找最短子串
我写了一段代码,用来从一个字符串中找出子字符串。它会打印出所有的子字符串。
但是我想要的是长度在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: 为了更完整,经过我简单的测试,计算最短元素的长度并在列表推导式中使用这个长度,应该会更快。上面的内容已更新。