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関数を 2 番目の引数として使用できます。

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

編集:
2つが同じ長さの場合、これをさらに拡張して、すべて同じ長さの要素を含むリストを作成できます:

>>> 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つしかない場合にも機能するはずです。

EDIT 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を長さでソートし、ソートされたリストの最初の項目を返すことによって機能します。

編集:Nick Prestaの答えはよりエレガントです。私はそれが議論minをする可能性があることに気づいていませんでした...key

于 2009-04-27T06:13:47.330 に答える