gpt4 book ai didi

regex - 解析字符串时的Perl while循环

转载 作者:行者123 更新时间:2023-12-04 02:42:31 25 4
gpt4 key购买 nike

我有一个关于解析一个向量有这样的字符串的问题:

"chr1-247751935-G-.:M92R,chr1-247752366-G-.:R236G,"
"chr1-247951785-G-.:G98K,"
"chr13-86597895-S-78:M34*,chr13-56891235-S-8:G87K,chr13-235689125-S-7:M389L,"

我想得到:

"M92R R236G"
"G98K"
"M34* G87K M389L"

当我使用

while ($info1=~s/^(.*)\:(([A-Z\*]){1}([\d]+)([A-Z\*]){1})\,//) 
{
$pos=$2;
}

结果 $pos 只给我每一行的最后一个,即:

"R236G"
"G98K"
"M389L"

我应该如何更正脚本?

最佳答案

您的代码不起作用的原因是您在正则表达式的开头有一个贪婪 ^(.*)。只要模式的其余部分匹配,它就会尽可能多地占用目标字符串,因此您只会找到子字符串的 last 出现。您只需将其更改为非贪婪模式即可修复它 ^(.*?)

关于正则表达式的一些其他注意事项:

  • 在字符类 [ ...]

  • 永远不需要量词 {1},因为这是没有量词的模式的效果

  • 没有必要将 \d 放在字符类 [\d] 中,因为它自己可以正常工作

    <
  • 没有必要将子模式括在括号中,除非您需要在匹配成功时访问与该子模式匹配的任何子字符串。因此,例如 ^.* 没有括号就可以了

您的代码修改与您的代码相同,但更加简洁

while ($info1 =~ s/^.*?:([A-Z*]\d+[A-Z*]),// ) {
my $pos = $1;
...
}

但最好的解决方案是使用全局匹配来查找字符串中出现的所有模式,并且不需要在此过程中修改字符串。

该程序按照您的描述进行操作。它只是查找每条记录中冒号后的所有字母数字或星号字符串。

use strict;
use warnings;

while (<DATA>) {
my @fields = /:([A-Z0-9*]+)/g;
print "@fields\n";
}

__DATA__
"chr1-247751935-G-.:M92R,chr1-247752366-G-.:R236G,"
"chr1-247951785-G-.:G98K,"
"chr13-86597895-S-78:M34*,chr13-56891235-S-8:G87K,chr13-235689125-S-7:M389L,"

输出

M92R R236G
G98K
M34* G87K M389L

关于regex - 解析字符串时的Perl while循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19575933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com