发信人: jiangfei (afei), 信区: Perl
标 题: 特殊符号的匹配问题
发信站: 水木社区 (Sun Jun 26 11:07:12 2005), 转信
我想把每个词后面的词性信息去掉(/xxx形式)词性信息中可能有各种各样非字字符
而且必须对应词性表去删除(词性表中有的词性信息才可删除)
我下面的程序先定义词性表,然后对文件中每句话匹配删除,
可是例子中的/prep$ 和/m(variable) 无法正确匹配,请指教。。
#!
#输入:
1(5:5)规则/a ->(1:1)RULES/A
1(2:2)壶/ng ->(3:3)PLAY/NNP
2(2:5)壶/prep$ 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/NNP PLAY/NNP
2(1:5)冰/m(variable) 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/NNP PLAY/NNP
#输出:
1(5:5)规则 ->(1:1)RULES
1(2:2)壶 ->(3:3)PLAY
2(2:5)壶 之 竞赛 规则 ->(1:3)RULES OF PLAY
2(1:5)冰 壶 之 竞赛 规则 ->(1:3)RULES OF PLAY
open IN ,"input.txt" or die "can not open file,$!/n ";
open RESULT, ">output.txt" or die"can not open >out.txt,$!/n";
@all = <IN>;
my @pos_table;
#初始化@pos_table
@pos_table[0] = '/a';
@pos_table[1] = "/A";
@pos_table[2] = "/prep$";
@pos_table[3] = "/m(variable)";
@pos_table[4] = "/NNP";
@pos_table[5] = "/usde";
@pos_table[6] = "/ng";
my $pos_num = 7;
for(my $count = 0; $count < @all ;$count +=1)
{
my $str = @all[$count];
#$str =~ s///[/S]+ / /g;#warning
for(my $i = 0;$i<$pos_num;$i++)
{
$str =~s/$pos_table[$i]//g;
}
print RESULT $str;
}
print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n";
print "按任意键结束/n";
$wait = <STDIN>;
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]
|
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 11:13:06 2005), 转信
pos_table里的特殊字符得转义吧,/,$等等
【 在 jiangfei (afei) 的大作中提到: 】 : 我想把每个词后面的词性信息去掉(/xxx形式)词性信息中可能有各种各样非字字符 : 而且必须对应词性表去删除(词性表中有的词性信息才可删除) : 我下面的程序先定义词性表,然后对文件中每句话匹配删除, : ...................
-- ╭───────────────┬──今夏的亮点 ├☆ 十年岁月 ≮ ~~~ ≯ ╰╮ ├☆ 辉煌水木 ╰╮ 十年水木纪念站衫 ├★ 我们的bbs │ ├★ 我们自己创造 @@ │ 欢迎访问T_shirt
※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]
|
|
发信人: jiangfei (afei), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 11:26:24 2005), 转信
我转义试过了也不好时的 【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : pos_table里的特殊字符得转义吧,/,$等等
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]
|
|
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:20:19 2005), 转信
()和$也要转义的,直接用quotemeta?
#!/usr/bin/perl -w use strict; my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng); my $rule; { local $/=''; $rule=<>; } for my $pos(@pos_table){ $pos=quotemeta($pos); $rule =~ s/$pos(?= |/n|$)//gs; } print $rule;
【 在 jiangfei (afei) 的大作中提到: 】 : 我转义试过了也不好时的
-- ╭───────────────┬──今夏的亮点 ├☆ 十年岁月 ≮ ~~~ ≯ ╰╮ ├☆ 辉煌水木 ╰╮ 十年水木纪念站衫 ├★ 我们的bbs │ ├★ 我们自己创造 @@ │ 欢迎访问T_shirt
※ 修改:·rogerz 于 Jun 26 12:20:56 修改本文·[FROM: 211.151.90.*] ※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]
|
|
发信人: jiangfei (afei), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:24:53 2005), 转信
非常感谢 !我现在试试 【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : ()和$也要转义的,直接用quotemeta? : #!/usr/bin/perl -w : use strict; : ...................
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]
|
|
发信人: jiangfei (afei), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:35:31 2005), 转信
sigh! 还是不work! hehe 【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : ()和$也要转义的,直接用quotemeta? : #!/usr/bin/perl -w : use strict; : ...................
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]
|
|
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:38:11 2005), 转信
??,我这里没什么问题啊
~ $ perl tt.pl input.txt
1(5:5)规则 ->(1:1)RULES 1(2:2)壶 ->(3:3)PLAY 2(2:5)壶 之 竞赛 规则 ->(1:3)RULES OF PLAY 2(1:5)冰 壶 之 竞赛 规则 ->(1:3)RULES OF PLAY
【 在 jiangfei (afei) 的大作中提到: 】 : sigh! : 还是不work! : hehe : ...................
-- ╭───────────────┬──今夏的亮点 ├☆ 十年岁月 ≮ ~~~ ≯ ╰╮ ├☆ 辉煌水木 ╰╮ 十年水木纪念站衫 ├★ 我们的bbs │ ├★ 我们自己创造 @@ │ 欢迎访问T_shirt
※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]
|
|
发信人: jiangfei (afei), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:45:46 2005), 转信
帅气! 好使极了! 谢谢! 如何把输出文件也设为命令行输入形式呢? 俺这几句看不懂,羞.... my $rule; { local $/=''; $rule=<>; }
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : ??,我这里没什么问题啊 : ~ $ perl tt.pl input.txt : 1(5:5)规则 ->(1:1)RULES : ...................
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]
|
|
发信人: GunFactory (Arsenal), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:51:58 2005), 转信
读出整个文件阿 看看$/什么意思 【 在 jiangfei (afei) 的大作中提到: 】 帅气! 好使极了! 谢谢! 如何把输出文件也设为命令行输入形式呢? 俺这几句看不懂,羞.... my $rule; { local $/=''; $rule=<>; }
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : ??,我这里没什么问题啊 : ~ $ perl tt.pl input.txt : 1(5:5)规则 ->(1:1)RULES : ...................
--
--
※ 来源:·水木社区 newsmth.net·[FROM: 61.167.60.*]
|
|
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:53:50 2005), 转信
【 在 jiangfei (afei) 的大作中提到: 】 : 帅气! : 好使极了! : 谢谢! : 如何把输出文件也设为命令行输入形式呢? : 俺这几句看不懂,羞.... : my $rule; : { : local $/=''; perldoc perlvar
默认$/是/n,所以标量环境下只读入一行,undef之后就一次性读入文件全部内容了
命令行参数用@_访问 比如tt.pl input.txt output.txt 那么 ($in,$out)=@_;
: $rule=<>; : }
-- ╭───────────────┬──今夏的亮点 ├☆ 十年岁月 ≮ ~~~ ≯ ╰╮ ├☆ 辉煌水木 ╰╮ 十年水木纪念站衫 ├★ 我们的bbs │ ├★ 我们自己创造 @@ │ 欢迎访问T_shirt
※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]
|
|
发信人: jiangfei (afei), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 12:57:16 2005), 转信
但是,我把核心部分放在我程序中,却不好使,怪啊! 因为文件太大,所以不可能一次把文件读到一个量中 要一行一行处理,又应该如何改写呢?
#!/usr/bin/perl -w #输入: #1(5:5)规则/ng ->(1:1)RULES/NNP #1(2:2)壶/ng ->(3:3)PLAY/NNP #2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP #2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP #输出: #1(5:5)规则 ->(1:1)RULES #1(2:2)壶/ng ->(3:3)PLAY #2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP #2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP use strict; open IN ,"input.txt" or die "can not open file,$!/n "; open RESULT, ">output.txt" or die"can not open >out.txt,$!/n";
my @all = <IN>; my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng); print join("/n",@pos_table);
for(my $count = 0; $count < @all ;$count +=1) { my $str = @all[$count]; for my $pos(@pos_table){ $pos=quotemeta($pos); $str =~ s/$pos(?= |/n|$)//gs; } print RESULT $str; } print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n"; print "按任意键结束/n"; my $wait = <STDIN>;
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : perldoc perlvar : 默认$/是/n,所以标量环境下只读入一行,undef之后就一次性读入文件全部内容了 : 命令行参数用@_访问 : ...................
--
※ 修改:·jiangfei 於 Jun 26 12:59:49 2005 修改本文·[FROM: 61.167.60.*] ※ 修改:·jiangfei 於 Jun 26 13:03:04 2005 修改本文·[FROM: 61.167.60.*] ※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]
|
|
发信人: rogerz (章鱼·相遇之后向前走), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 13:02:25 2005), 转信
: my @all = <IN>; : my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng); : print join("/n",@pos_table); : for(my $count = 0; $count < @all ;$count +=1) : { : my $str = @all[$count]; 这个肯定错了,应该是$all[$count]; ps: 我觉得你写的程序更像c语言…… : for my $pos(@pos_table){ : $pos=quotemeta($pos); : $str =~ s/$pos(?= |/n|$)//gs; : } : print RESULT $str; : } : print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n"; : print "按任意键结束/n"; : my $wait = <STDIN>;
-- ╭───────────────┬──今夏的亮点 ├☆ 十年岁月 ≮ ~~~ ≯ ╰╮ ├☆ 辉煌水木 ╰╮ 十年水木纪念站衫 ├★ 我们的bbs │ ├★ 我们自己创造 @@ │ 欢迎访问T_shirt
※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]
|
|
发信人: Andor (柠檬汁), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 13:47:05 2005), 转信
【 在 jiangfei (afei) 的大作中提到: 】 : 但是,我把核心部分放在我程序中,却不好使,怪啊! : 因为文件太大,所以不可能一次把文件读到一个量中 : 要一行一行处理,又应该如何改写呢? : #!/usr/bin/perl -w : #输入: : #1(5:5)规则/ng ->(1:1)RULES/NNP : #1(2:2)壶/ng ->(3:3)PLAY/NNP : #2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP : #2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP : #输出: : #1(5:5)规则 ->(1:1)RULES : #1(2:2)壶/ng ->(3:3)PLAY : #2(2:5)壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP : #2(1:5)冰/ng 壶/ng 之/usde 竞赛/ng 规则/ng ->(1:3)RULES/NNP OF/IN PLAY/NNP : use strict; : open IN ,"input.txt" or die "can not open file,$!/n "; : open RESULT, ">output.txt" or die"can not open >out.txt,$!/n"; : my @all = <IN>; close(IN); 不过不加也没什么影响。 : my @pos_table=qw(/a /A /prep$ /m(variable) /NNP /usde /ng); my @pos_table = map(quotemeta, qw(/a /A /prep$ /m(variable) /NNP /usde /ng)); # 建议命名为 @quoted_pos_table 或 @regex_pos_table :) : print join("/n",@pos_table); 调试还应该每次用的时候检查一下,看看有没有被改变什么的, 不能光检查一下初值就了事啊 ^_^ : for(my $count = 0; $count < @all ;$count +=1) : { : my $str = @all[$count]; my $str = $all[$count]; 虽然不改也能得到同样结果,但是逻辑上有语义错误。
然后,以上两句(从for开始),以perl的风格,建议写成: foreach my $str (@all) { : for my $pos(@pos_table){ : $pos=quotemeta($pos); 去掉上面这行。 修改$pos会影响@pos_table本身,虽然在只用一次时不影响结果, 但这个语义错误在多次使用时会导致结果不是你预期的。 : $str =~ s/$pos(?= |/n|$)//gs; 这里不需要s参数,不过加了也没影响。 另外循环体应该缩进。 : } : print RESULT $str; : } close(RESULT); 不关闭输入文件也罢了,不关闭输出文件就…… ;) : print "warning: 如果发现结果不正确,请用记事本程序打开源程序/n查看warning句后是否正确初始化所有词性/n"; : print "按任意键结束/n"; : my $wait = <STDIN>; 这里直接写<STDIN>;就行,另外前面一行提示应该是“回车键”而不是“任意键”吧?
-- ※ 修改:·Andor 于 Jun 26 13:55:44 修改本文·[FROM: 143.89.144.*] ※ 来源:·水木社区 newsmth.net·[FROM: 143.89.144.*]
|
|
发信人: Andor (柠檬汁), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 13:50:11 2005), 转信
【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : 这个肯定错了,应该是$all[$count]; : ps: : 我觉得你写的程序更像c语言…… 呵呵,我觉得也不太像C。 C的话那里不会用“+= 1”,也不会加“my $wait =”……
--
※ 来源:·水木社区 newsmth.net·[FROM: 143.89.144.*]
|
|
发信人: jiangfei (afei), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 15:09:15 2005), 转信
以前一直这样用,呵呵! 痛改前非! 【 在 rogerz (章鱼·相遇之后向前走) 的大作中提到: 】 : 这个肯定错了,应该是$all[$count]; : ps: : 我觉得你写的程序更像c语言……
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.167.60.*]
|
|
发信人: jiangfei (afei), 信区: Perl 标 题: Re: 特殊符号的匹配问题 发信站: 水木社区 (Sun Jun 26 15:10:05 2005), 转信
看了Andor的回帖,我觉得真是痛快! 呵呵,谢谢指教。 【 在 Andor (柠檬汁) 的大作中提到: 】 : close(IN); : 不过不加也没什么影响。 : my @pos_table = map(quotemeta, qw(/a /A /prep$ /m(variable) /NNP /usde /ng)); : ...................
--
|