python - 正则表达式:如何连续查找 3 个或更多匹配项,而不仅仅是一一匹配

标签 python regex

我尝试在文件中查找“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/01/ 的数字,后跟单词边界以防止部分匹配
  • ){3} 关闭组并重复 3 次

Regex demo

如果您还想匹配该行的其余部分,可以将 .* 附加到模式中。

关于python - 正则表达式:如何连续查找 3 个或更多匹配项,而不仅仅是一一匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70577658/

相关文章:

python - Flask 测试、post 文件和嵌套字典

javascript - 向正则表达式构造函数添加限制

javascript - 正则表达式与 "1 1"JavaScript 中的数字不匹配

python - 如何从 Pandas 数据框中的列中删除字符串值

python - 迭代 Pickle 文件中的多个字典

Python mod json + urllib2

python - 使用 Python 的高效滚动修剪均值

python - 为什么在python中打开多个游标时sql会挂起?

regex - 使用正则表达式检测空白

javascript - 向正则表达式添加总字符数限制