查找两个模式出现之间的最短匹配



我使用模式\n(((?!.g).)*?.vcf.gz)\r来匹配字符串中所需的子字符串。在下面的示例字符串中,匹配位于字符串的中间,被两个rn包围。

"rn1115492_23181_0_0.g.vcf.gz.tbirn1115492_23181_0_0.vcf.gzrn1115492_23181_0_0.vcf.gz.tbirn..."

使用上面的模式产生所需的字符串1115492_23181_0_0.vcf.gz以及0
我的问题是什么将是正确的正则表达式,只得到所需的字符串。


谢谢。

您有匹配相等的行,因此在.vcf.gz扩展名之前的任何地方匹配不包含.g的整行:

import re
text = "rn1115492_23181_0_0.g.vcf.gz.tbirn1115492_23181_0_0.vcf.gzrn1115492_23181_0_0.vcf.gz.tbirn..."
m = re.search(r"^((?:(?!.g).)*.vcf.gz)r?$", text, re.M)
if m:
print(m.group(1)) # => 1115492_23181_0_0.vcf.gz

查看Python演示。

细节:

  • ^-行起始
  • ((?:(?!.g).)*.vcf.gz)-第1组:
    • (?:(?!.g).)*-除换行符以外的任何字符,一个或多个但尽可能多地出现,不开始.g字符序列
    • .vcf.gz- a.vcf.gz字符串
  • r?-可选CR(回车)
  • $-行尾

最新更新