在python中搜索字符串中的通配符并返回匹配位置

时间:2013-08-16 21:02:48

标签: python regex string search motif

我目前正在处理一个由数千个带有身份的字符串组成的数据集,并且想要搜索通配符主题的位置(由N组成,后跟除了P之外的任何字母,然后是S或a)使用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]],.....]

如果有人有任何想法,我将非常感谢,谢谢!

2 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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]