3

私は現在、アイデンティティを持つ何千もの文字列で構成されるデータセットを扱っており、ワイルドカード モチーフ (N の後に P 以外の任意の文字が続き、その後に S または T が続く) の位置を検索したいと考えています。 RegExモジュールを使用して文字列内で発生し、モチーフが発生する位置を持つIDペアのリストを返します。

import re
strings = [['ID#1','NTGSLTKNASMNLTQRSNQT'],['ID#2','NLSHTNWEUWBNTTDKWODNUT'],...]
for x in strings:
    re.search('N[^P][ST]',x[1])

返品したいもの:

[['ID#1',[8,12,18]],['ID#2',[1,12,20]],.....]

誰かが何かアイデアを持っていれば、それは非常にありがたいです、ありがとう!

4

2 に答える 2

1

代わりにこれを探している可能性が高いです。

re.finditer(pattern, string[, flags]) 

文字列内の RE パターンの重複しないすべての一致に対して MatchObject インスタンスを生成する反復子を返します。文字列は左から右にスキャンされ、見つかった順序で一致が返されます。空の一致は、別の一致の先頭に触れない限り、結果に含まれます。

これは動作します..

import re

strings = [['ID#1','NTGSLTKNASMNLTQRSNQT'],['ID#2','NLSHTNWEUWBNTTDKWODNUT']]
pattern = re.compile('N[^P][ST]')

print [[f[0], [m.start() + 1 for m in pattern.finditer(f[1])]] for f in strings]

または、次のようなものを試すことができます..

import re

strings = [['ID#1','NTGSLTKNASMNLTQRSNQT'],['ID#2','NLSHTNWEUWBNTTDKWODNUT']]
pattern = re.compile('N[^P][ST]')

for x in strings:
    p = pattern.finditer(x[1])
    print [[x[0], [m.start() + 1 for m in p]]
于 2013-08-16T21:27:12.063 に答える
0

私はPythonの経験があまりありませんが、次のようなことができると思います:

import re
strings = [['ID#1','NTGSLTKNASMNLTQRSNQT'],['ID#2','NLSHTNWEUWBNTTDKWODNUT']]
def findpos(s):
    return [s[0], [m.start() + 1 for m in re.finditer('N[^P][ST]',s[1])]]

return map(findpos, strings)
// [['ID#1', [8, 12, 18]], ['ID#2', [1, 12, 20]]]

またはさらに簡単に、次のようにします。

[[s[0], [m.start() + 1 for m in re.finditer('N[^P][ST]',s[1])]] for s in strings]
于 2013-08-16T21:21:23.813 に答える