【发布时间】:2021-08-11 12:25:27
【问题描述】:
我说要学习正则表达式,我正在尝试使用它来解决问题。 我需要编写一个获取 VCF 文件的函数,并且需要检查文件中的某些列,看看它们是否符合要求。
第一列应以“chr”开头,以 1-99 之间的任意数字或字母“M,X,Y”之一结尾。 第二列必须是所有大于 0 的整数。 第 4 列和第 5 列需要是下一个字母“ATCG”之一(仅其中一个)。 如果其中一个语句即使在一行中也是错误的,它也应该返回 false。
这是我写的代码:
def isVCF(file):
with open(file, "r+") as my_file:
lines = my_file.readlines()
for line in lines:
columns = line.split("\t")
num_format = re.compile("^[+]?[1-9][0-9]*\.?[0-9]+$")
if (re.match(r"^chr(?:[1-9][0-9]?|[XYM])$", columns[0])
and re.match(num_format, columns[1])
and re.match(r"^[ATGC]$", columns[3])
and re.match(r"^[ATGC]$", columns[4])):
return True
else:
return False
我检查了两个文件 - 一个应该返回 True,另一个应该返回 False,但我对它们都得到 True,所以我尝试逐行进行测试,但仍然得到 True。 文件示例:
ChrX, 74226650, ., T, C, 50, ., DP=385;VDB=0;SGB=-0.693147;RPB=0.982669;MQB=1;BQB=0.947576;MQ0F=0;AC=2;AN=2;DP4=0,95,0,289;MQ=20, GT:PL:DP, 1/1:78,127,0:384
输出应该是或真或假取决于条件。
感谢任何帮助!
【问题讨论】:
-
为什么是正则表达式?对于第一列,这可能是一个不错的选择,但对于其他列,使用
columns[1].isdecimal()和columns[3] in {'A', 'T', 'G', 'C'}会更容易。 -
我是新手,我知道我可以使用其他更简单的方法来解决它,但我想练习正则表达式
-
您能否提供一个示例 VCF 文件以及它的确切预期输出?谢谢
-
@ggorlen 我找不到上传文件的位置,但我添加了它的图像
-
谢谢,但不可能从图像中真正分辨出字符级别发生了什么,例如,是制表符还是空格(多少个空格?)分隔、隐藏字符、看起来像的 unicode 字符像 ASCII 字符等,所以它需要做出可能导致错误答案的假设/猜测——对您或其他任何人都没有帮助。我无法由此判断文本行之间是否有两个换行符或只有一个。请问可以发text吗?谢谢。
标签: python regex function boolean