免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1835 | 回复: 9
打印 上一主题 下一主题

有关正则表达式匹配的问题,求高手帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-21 20:17 |只看该作者 |倒序浏览
原文件内容
<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
我是新手对匹配的语句有点陌生,希望大家帮忙!
谢谢大家了!

论坛徽章:
0
2 [报告]
发表于 2008-05-21 21:14 |只看该作者
  • 括号前面出现包括NP的字符(或只有NP)的在后面加个B
  • 括号前面不带字母的就在后面加个I
  • 括号前面带字母但没有NP的就加个O
  • 我是新手对匹配的语句有点陌生,希望大家帮忙!

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

论坛徽章:
0
3 [报告]
发表于 2008-05-22 08:21 |只看该作者

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

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

  10.                 if ($s1 =~ /\w+/) {
  11.                     if ($s1 =~ /NP/) {
  12.                             print "$s3 $s2 B-NP\n";
  13.                         } else {       
  14.                             print "$s3 $s2 O-NP\n";
  15.                         }
  16.                 } else {
  17.                     print "$s3 $s2 I-NP\n";
  18.                 }
  19.         }
  20. }
  21. __DATA__
  22. <DOC>
  23. <DOCID>DNPIN.19960210.0178</DOCID>
  24. <HEADER>
  25. <DATE>1996-02-10</DATE>
  26. </HEADER>
  27. <BODY>
  28. <headline>
  29. ( (IP-HLN (NP-SBJ (NP (NP-PN (NR 上海)
  30.         (NR 浦东))
  31.         (NP (NP (NN 开发))
  32.      (CC 与)
  33.      (NN 法制)
  34.      (NN 建设))))
  35.    (VP (VV 同步))) )
  36. </HEADLINE>
  37. <TEDNPT>
  38. <P>

复制代码

论坛徽章:
0
4 [报告]
发表于 2008-05-22 11:46 |只看该作者

回复 #3 cobrawgl 的帖子

十分感谢!你真是个大好人

论坛徽章:
0
5 [报告]
发表于 2008-05-22 12:13 |只看该作者

回复 #3 cobrawgl 的帖子

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

论坛徽章:
0
6 [报告]
发表于 2008-05-22 12:30 |只看该作者
原帖由 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";

改成这样的。

论坛徽章:
0
7 [报告]
发表于 2008-05-22 12:40 |只看该作者

回复 #6 cobrawgl 的帖子

#!/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);
我改成这样了,但好是不行!
谢谢

论坛徽章:
0
8 [报告]
发表于 2008-05-22 12:58 |只看该作者



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

  12.                 if ($s1 =~ /\w+/) {
  13.                     if ($s1 =~ /NP/) {
  14.                             print FILE "$s3 $s2 B-NP\n";
  15.                         } else {        
  16.                             print FILE"$s3 $s2 O-NP\n";
  17.                         }
  18.                 } else {
  19.                     print FILE"$s3 $s2 I-NP\n";
  20.                 }
  21.         }
  22. }

  23. close(File);
复制代码

论坛徽章:
0
9 [报告]
发表于 2008-05-22 13:07 |只看该作者

回复 #8 cobrawgl 的帖子

成功完成!谢谢你了!

论坛徽章:
0
10 [报告]
发表于 2008-05-22 13:40 |只看该作者
呵呵,你的基础还不过关,先看看小骆驼吧。。。cobrawgl  还真是大天使。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP