在 perl 中使一个正则表达式到 grep 值处理具有不同结尾的字符串



我在perl中有这段代码,我想提取'EUR_AF'的值,在本例中'0.39'。有时'EUR_AF'';'结尾,有时则不然。或者,'EUR_AF'可能以 '=0' 结尾,而不是 '=0.39;''=0.39'

如何使代码处理它?似乎无法在网上找到它...我当然可以用几乎无休止的if-elsif-else语句来包装所有内容,但这似乎有点矫枉过正。

示例文本:

AVGPOST=0.9092;AN=2184;RSQ=0.5988;ERATE=0.0081;AC=144;VT=SNP;THETA=0.0045;AA=A;SNPSOURCE=LOWCOV;LDAF=0.0959;AF=0.07;ASN_AF=0.05;AMR_AF=0.10;AFR_AF=0.11;EUR_AF=0.039

代码:$INFO =~ m/;EUR_AF=(.*?)(;)/

我确实发现:$INFO =~ m/;EUR_AF=(.*?0)/处理EUR_AF=0的情况,但如何有效地处理替代场景?

提取一个值:

my ($eur_af) = $s =~ /(?:^|;)EUR_AF=([^;]*)/;

my ($eur_af) = ";$s" =~ /;EUR_AF=([^;]*)/;

提取所有值:

my %rec = split(/[=;]/, $s);
my $eur_af = $rec{EUR_AF};

这个正则表达式应该适合你: (?<=EUR_AF=)d+(.d+)?这意味着

(?<=EUR_AF=) - 查找前面带有 EUR_AF= 的字符串

d+(.d+)? - 由数字组成,可选择十进制数字

编辑:我最初希望整个正则表达式返回正确的结果,而不仅仅是捕获组。如果您希望正确的捕获组将其编辑为(?<=EUR_AF=)(d+(?:.d+)?)

我已经找到了答案。代码:

$INFO =~ m/(?:^|;)EUR_AF=([^;]*)/

似乎处理的是EUR_AF=0EUR_AF=0.39的情况,;结尾或不结尾。生成的$INFO将是00.39

最新更新