Поиск строк для Wildcard в python и возврат позиции совпадения

В настоящее время я имею дело с набором данных, который состоит из тысяч строк с идентичностями и хотел бы найти позиции, в которых используется шаблон с подстановочными знаками (который состоит из N, за которым следует любая буква, кроме P, а затем S или T) происходит внутри строки с использованием модуля RegEx и возвращает список пар идентификаторов с позициями, в которых встречается мотив.

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]],.....]

Если у кого-то есть какие-либо идеи, это будет очень цениться, спасибо!

2 ответа

Вы, скорее всего, ищете это вместо этого.

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

Вернуть итератор, выдающий экземпляры MatchObject по всем неперекрывающимся совпадениям для шаблона RE в строке. Строка сканируется слева направо, и совпадения возвращаются в указанном порядке. Пустые совпадения включаются в результат, если они не касаются начала другого совпадения.

Это будет работать..

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]]

Я не очень опытный в 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]
Другие вопросы по тегам