我在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=0
和EUR_AF=0.39
的情况,以;
结尾或不结尾。生成的$INFO
将是0
或0.39
。