Regex отлично подходит для проверки глобальной достоверности последовательности. К сожалению, я не понимаю, как можно добиться проверки ошибок с помощью одного регулярного выражения.
Поэтому я думаю, что вы можете использовать регулярное выражение для проверки правильности ввода. Если он недействителен, вы можете добавить еще код, чтобы предупредить пользователя о том, что может быть не так.
import re
def _check_input(var_str):
"""
Checks if the input is a valid variant string
:param var_str: string supposed to be in the format 'chr-pos-ref-alt'
:return: a match object
:raises: ValueError on invalid input
"""
pattern = re.compile(
r"(?:chr)?(?P<chr>[1-9]|[1][0-9]|[2][0-3]|[XY])" # the chromosome
r"-(?P<pos>\d+)" # the position
r"-(?P<ref>[ACGT])" # RawDescriptionHelpFormatter
r"-(?P<alt>[ACGT])", # alt
re.X | re.IGNORECASE,
)
match = re.match(pattern, var_str)
if not match:
_input_error_suggestion(var_str)
return match # you can access values like so match['chr'], match['pos'], match['ref'], match['alt']
def _input_error_suggestion(var_str):
parts = var_str.split('-')
if len(parts) != 4:
raise ValueError('Input should have 4 parts separated by -')
chr, pos, nucleotide1, nucleotide2 = parts
# check part 1
chr_pattern = re.compile(r'(?:chr)?([1-9]|[1][0-9]|[2][0-3]|[XY])', re.IGNORECASE)
if not re.match(chr_pattern, chr):
raise ValueError('Input first part should be a chromosome chr1, chr2, ..., chr 23, chrX, chrY')
# check part 2
try:
p = int(pos)
except ValueError:
raise ValueError('Input second part should be an integer')
if p < 0:
raise ValueError('Input second part should be a positive integer')
# check part 3 and 4
for i, n in enumerate((nucleotide1, nucleotide2)):
if n not in 'ACGT':
raise ValueError(f"Input part {3 + i} should be one of {{A,C,G,T}}")
# something else
raise ValueError(f"Input was malformed, it should be in the format 'chr-pos-ref-alt'")
примечания:
Я улучшил исходное регулярное выражение на
- добавление необязательного «chr»,
- группы имен,
- одна и только одна буква на нуклеотид,
- исправление отсутствующих хромосом 23 и
- позволяет не учитывать регистр.