有关正则表达式匹配的问题,求高手帮忙

有关正则表达式匹配的问题,求高手帮忙

原文件内容
<DOC>
<DOCID>DNPIN.19960210.0178</DOCID>
<HEADER>
<DATE>1996-02-10</DATE>
</HEADER>
<BODY>
<headline>
( (IP-HLN (NP-SBJ (NP (NP-PN (NR 上海)
        (NR 浦东))
        (NP (NP (NN 开发))
     (CC 与)
     (NN 法制)
     (NN 建设))))
   (VP (VV 同步))) )
</HEADLINE>
<TEDNPT>
<P>
输出结果
上海 NR B-NP
浦东 NR I-NP
开发 NN B-NP
与 CC I-NP
法制 NN I-NP
建设 NN I-NP
同步 VV o-vp
怎么通过正则表达式的匹配得到输出的结果啊?
括号前面出现包括NP的字符(或只有NP)的在后面加个B
括号前面不带字母的就在后面加个I
括号前面带字母但没有NP的就加个O
我是新手对匹配的语句有点陌生,希望大家帮忙!
谢谢大家了!

  • 括号前面出现包括NP的字符(或只有NP)的在后面加个B
  • 括号前面不带字母的就在后面加个I
  • 括号前面带字母但没有NP的就加个O
  • 我是新手对匹配的语句有点陌生,希望大家帮忙!

规则写得很清楚嘛,匹配也没有问题,都是把思路直接用程序表达出来而已。


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl

use strict;
use warnings;

while (<DATA>) {
    chomp;
        if (/(.+)\((..) ([^)]+)\)/) {
                my $s1 = $1;
                my $s2 = $2;
                my $s3 = $3;

                if ($s1 =~ /\w+/) {
                    if ($s1 =~ /NP/) {
                            print "$s3 $s2 B-NP\n";
                        } else {       
                            print "$s3 $s2 O-NP\n";
                        }
                } else {
                    print "$s3 $s2 I-NP\n";
                }
        }
}
__DATA__
<DOC>
<DOCID>DNPIN.19960210.0178</DOCID>
<HEADER>
<DATE>1996-02-10</DATE>
</HEADER>
<BODY>
<headline>
( (IP-HLN (NP-SBJ (NP (NP-PN (NR 上海)
        (NR 浦东))
        (NP (NP (NN 开发))
     (CC 与)
     (NN 法制)
     (NN 建设))))
   (VP (VV 同步))) )
</HEADLINE>
<TEDNPT>
<P>

十分感谢!你真是个大好人
我想把输出的东西存到e:\3.txt中去
open(FileIn,">>e:\\3.txt") or die "can't open file\n";
close(File);
为什么没有存到e:\\3.txt中去吧!
谢谢了!


QUOTE:
原帖由 bdwangchen 于 2008-5-22 12:13 发表
我想把输出的东西存到e:\3.txt中去
open(FileIn,">>e:\\3.txt") or die "can't open file\n";
close(File);
为什么没有存到e:\\3.txt中去吧!
谢谢了!

你不往里打印怎么会有东西。

open FILE, ">>e:/3.txt"

......

print FILE "$s3 $s2 B-NP\n";

改成这样的。
#!/usr/bin/perl
use strict;
use warnings;
open(FileIn,"e:\\1.txt")||die"can't open";
while (<FileIn>) {
    chomp;
        if (/(.+)\((..) ([^)]+)\)/) {
                my $s1 = $1;
                my $s2 = $2;
                my $s3 = $3;

                if ($s1 =~ /\w+/) {
                    if ($s1 =~ /NP/) {
                            print FILE "$s3 $s2 B-NP\n";
                        } else {        
                            print FILE"$s3 $s2 O-NP\n";
                        }
                } else {
                    print FILE"$s3 $s2 I-NP\n";
                }
        }
}
open(FILE,">>e:\\3.txt") or die "can't open file\n";
close(File);
我改成这样了,但好是不行!
谢谢


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use strict;
use warnings;
open(FileIn,"e:\\1.txt")||die"can't open";
open(FILE,">>e:\\3.txt") or die "can't open file\n";   <---------
while (<FileIn>) {
    chomp;
        if (/(.+)\((..) ([^)]+)\)/) {
                my $s1 = $1;
                my $s2 = $2;
                my $s3 = $3;

                if ($s1 =~ /\w+/) {
                    if ($s1 =~ /NP/) {
                            print FILE "$s3 $s2 B-NP\n";
                        } else {        
                            print FILE"$s3 $s2 O-NP\n";
                        }
                } else {
                    print FILE"$s3 $s2 I-NP\n";
                }
        }
}

close(File);

成功完成!谢谢你了!
呵呵,你的基础还不过关,先看看小骆驼吧。。。cobrawgl  还真是大天使。。。