我尝试在文件中查找“1/1”或“0/0”出现 3 次或更多次的行。我在 Python 中使用正则表达式。我用 https://regex101.com/ 测试我的正则表达式.
这是我的输入文件的一部分:
0 chr1 1152 NaN G A 1355.64 NaN 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1
4 chr1 1331 NaN A C 4171.07 NaN 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1
5 chr1 1349 NaN T C 11194.50 NaN 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1
6 chr1 1401 NaN T G 10825.80 NaN 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1
8 chr1 4045 NaN G T 1917.92 NaN 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1
我编写了一个正则表达式来查找行的开头:
r"^\d\s{3}(chr\d)?\s{2}\d+\s+\D+\d+\.\d+\s+\w+"
但我对下一部分有疑问。我试过:
r"^\d\s{3}(chr\d)?\s{2}\d+\s+\D+\d+\.\d+\s+\w+(\s{2,}1/1|\s{2,}0/0)"
但它只找到第一次出现的“1/1”或“0/0”。当我尝试使用时:
r"^\d\s{3}(chr\d)?\s{2}\d+\s+\D+\d+\.\d+\s+\w+((\s{2,}1/1){3,}|(\s{2,}0/0){3,})"
那么只有一场比赛中“1/1”出现三次或更多次,但一个接一个:
8 chr1 4045 NaN G T 1917.92 NaN 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1
关于如何查找所有包含 >= 3 '1/1' 或 '0/0' 的行有什么想法吗? 非常感谢!
最佳答案
如果您想保留第一个捕获组,可以使用第一个模式,然后匹配 3 次 0/0 或 1/1
^\d\s{3}(chr\d)\s{2}\d+\s+\D+\d+\.\d+\s+\w+(?:(?:\s{2,}\d/\d)*?\s{2,}([10])/\2\b){3}
模式的第二部分:
(?:(?:\s{2,}\d/\d)*\s{2,}([10])/\2){3}
(?:
非捕获组作为整体重复(?:
不捕获\s{2,}\d/\d
匹配 2 个或更多空白字符
)*?
关闭组并可选择重复非贪婪\s{2,}
匹配 2 个或多个空白字符([10])/\2\b
捕获第 2 组中的 0 或 1,并匹配/
,后跟第 2 组的反向引用以匹配0/0
和1/
的数字,后跟单词边界以防止部分匹配
){3}
关闭组并重复 3 次
如果您还想匹配该行的其余部分,可以将 .*
附加到模式中。
关于python - 正则表达式:如何连续查找 3 个或更多匹配项,而不仅仅是一一匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70577658/