【发布时间】:2021-03-12 05:49:10
【问题描述】:
我有一个 ID 列表,我需要检查这些 ID 的格式是否正确。正确的格式如下:
[O,P,Q][0-9][A-Z,0-9][A-Z,0-9][A-Z,0-9][0-9]
[A-N,R-Z][0-9][A-Z][A-Z,0-9][A-Z,0-9][0-9]
A-N,R-Z][0-9][A-Z][A-Z,0-9][A-Z,0-9][0-9][A-Z][A-Z,0-9][A-Z,0-9][0-9]
字符串后面也可以跟一个破折号和一个数字。我的代码有两个问题:1)如何将字符串的长度限制为搜索词指定的字符数? 2)如果匹配,我如何指定字符串后面可以有一个“-[0-9]”?
potential_uniprots=['D4S359N116-2', 'DFQME6AGX4', 'Y6IT25', 'V5PG90', 'A7TD4U7ZN11', 'C3KQY5-V']
import re
def is_uniprot(ID):
status=False
uniprot1=re.compile(r'\b[O,P,Q]{1}[A-Z,0-9]{1}[A-Z,0-9]{1}[A-Z,0-9]{1}[0-9]{1}\b')
uniprot2=re.compile(r'\b[A-N,R-Z]{1}[0-9]{1}[A-Z,0-9]{1}[A-Z,0-9]{1}[0-9]{1}\b')
uniprot3=re.compile(r'\b[A-N,R-Z]{1}[0-9]{1}[A-Z]{1}[A-Z,0-9]{1}[A-Z,0-9]{1}[0-9]{1}[A-Z]{1}[A-Z,0-9]{1}[A-Z,0-9]{1}[0-9]{1}\b')
if uniprot1.search(ID) or uniprot2.search(ID)or uniprot3.search(ID):
status=True
return status
correctIDs=[]
for prot in potential_uniprots:
if is_uniprot(prot) == True:
correctIDs.append(prot)
print(correctIDs)
【问题讨论】:
-
这能回答你的问题吗? Regex to match words of a certain length
-
这能回答你的问题吗? stackoverflow.com/questions/4007302/…
-
您可以在字符类中省略
{1}和逗号(如果您不想匹配逗号)它们本身的模式不包含量词并且有单词边界。因此,在这些单词边界之间,您已经匹配了准确数量的字符。要匹配可选的连字符和数字,您可以使用可选的非捕获组(?:-[0-9])? -
@Thefourthbird 请看我的回答。我指出您的评论是我回答的“表达式修复”部分的功劳。如果您希望我更改任何内容或删除整个部分,请告诉我。