Perl正则表达式来标记整个术语

Perl正则表达式来标记整个术语,perl,Perl,我正在尝试使用注释列表标记术语。我特别想要实现的是,如果Perl正则表达式从一个句子中识别出一个术语,它应该用标记标记该术语 例如: This drug has adverse effect on Lymphocytes, Lymphnodes, Lymph and pre-lymphocytes. 我的列表中有“淋巴”这个词,我正在尝试下面的脚本 open IN, "clean_cells.txt" or die "import file absent"; @array=<IN>

我正在尝试使用注释列表标记术语。我特别想要实现的是,如果Perl正则表达式从一个句子中识别出一个术语,它应该用标记标记该术语

例如:

This drug has adverse effect on Lymphocytes, Lymphnodes, Lymph and pre-lymphocytes. 
我的列表中有“淋巴”这个词,我正在尝试下面的脚本

open IN, "clean_cells.txt" or die "import file absent";
@array=<IN>;
foreach $words(@array)  
{
    @cells=split/\t/,$words;
    $value=$cells[0];
    $replace=$cells[1];
    foreach my $fp (glob("$Directory/*.txt")) 
    {
        @id=split('/',$fp);
        $id[1]=~s/.txt//ig; 
        $Pub=$id[1];
        open FILE, "<",$fp or die "Can't open $fp: $!";
        open OUT, ">C:\\Users\\Desktop\\TM\\Files\\$Pub" or die "Check      output status";
        while(<FILE>)
        {
            chomp $_;
            $line=$_;
            s/\b[\w\-]*$value[\w\-]*\b/<$replace>$&<\\$replace>/gi;
            # $string[$i]=$line;
            # while(($string[$i]=~m/\Q$value\E/i)||                                      ($string[$i]=~m/\Q$value(\w+)\E/i)||($string[$i]=~m/\Q(\w+)$value\E/i))
            # # if ($string[$i] =~ m/\b\w*$value\w*\b/i)
            # {
                # $value=~s/$value/<$replace>$value<\$replace>/i;
            # }
            print OUT "$line\n";
        }
        last;

    }   
    last;
}
标记:表示上述脚本中的$replace

该程序标记的是基字lymoh,而不是整个术语淋巴细胞,即前淋巴细胞

尝试执行此操作(脚本重写):

使用严格;使用警告;
my$pub=“我必须更改某些内容才能使脚本正常工作”;
my$fp=“clean_cells.txt”;
my$of=“C:\\Users\\Hrishi\\Desktop\\TM\\Files\\\$Pub”;
my$replace='tag';
我的$word=“淋巴”;

打开文件,“您需要将单词放在一起。其中棘手的部分是确定哪些字符可以组成单词。一种更简单的方法(但可能不那么精确)是确定分隔符的组成。例如,您可以使用
\S+
匹配连续的非空白字符:

use strict;
use warnings;

while (<DATA>) {
    for (split /(\S+)/) {    # The parens make the split keep the delimiters
        $_ = "<tag>$_</tag>" if /lymph/i;
        print;
    }
}

__DATA__
Lymphocytes, Lymphnodes, Lymph and pre-lymphocytes.

我个人更喜欢这种功能,而不是硬编码的文件路径,这通常是*nix程序的工作方式。

等等?它工作吗?你期望什么?你有错误吗?最后,问题是什么?编辑它更多,因为我仍然看不到问题。@sputnick:对不起,它没有做任何事情。你检查了文件吗aths?是的。它正在工作。很抱歉,我检查了正确的路径。路径中有一个小错误。谢谢。我真的很感谢你的帮助。没有帮助。我正在使用while循环来确保扫描整行,我认为使用“if”将在句子中的一个匹配后退出循环。我希望程序标记所有可能的匹配句子中的es查看我编辑的文章和完整的脚本我提供了完整的代码。对不起,代码没有任何内容。您是否修改了文件路径并查看了脚本的输出?脚本在STDOUT(终端)上显示结果我想你误解了OP的需要,你只保留了带标签的字符串,但OP仍然需要不匹配的字符串。重新读取他的预期输出。这是一个错误的语句。我保留了所有内容。好的,对不起,你已经更改了回复的示例输入。我不能在分隔符处拆分,因为列表和sen中都有像Vitamin E这样的单词tence,Spliting会漏掉像Vitamin E这样的单词,因为Vitamin会被视为一个单位,E是另一个单位。@Pink Ok。你的单词列表很长吗?
use strict; use warnings;

my $pub = "SOMETHING I HAVE TO CHANGE FOR THE SCRIPT TO WORK";
my $fp = "clean_cells.txt";
my $of = "C:\\Users\\Hrishi\\Desktop\\TM\\Files\\$Pub";
my $replace = 'tag';
my $word = "Lymph";

open FILE, "<", $fp or die "Can't open $fp: $!";
open OUT,  ">", $of or die "Check output status";

while (<FILE>) {
    chomp;
    s/\b[\w\-]*$word[\w\-]*\b/<$replace>$&<\\$replace>/gi;
    print OUT $_; print;
}
use strict;
use warnings;

while (<DATA>) {
    for (split /(\S+)/) {    # The parens make the split keep the delimiters
        $_ = "<tag>$_</tag>" if /lymph/i;
        print;
    }
}

__DATA__
Lymphocytes, Lymphnodes, Lymph and pre-lymphocytes.
<tag>Lymphocytes,</tag> <tag>Lymphnodes,</tag> <tag>Lymph</tag> and <tag>pre-lymphocytes.</tag>
perl script.pl input > output