当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : Perl高手请进~求教
帖子发表于 : 2011-01-02 6:54 
头像

注册: 2010-10-16 10:03
帖子: 149
送出感谢: 0 次
接收感谢: 0 次
近来在学perl,遇到个正则匹配的问题。 :em20
原文件是MS的LETOR中一个计算RANKING性能的perl script(附件中的eval-score-mslr.txt,请改成.pl)
附件:
eval-score-mslr.txt [8.97 KiB]
被下载 9 次

其中的匹配行是(LINE209):
代码:
$lnFea =~ /^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/

数据来自MS2008,样子长得像下边的句子 :em06
引用:
0 qid:15903 1:0.011571 2:0.076923 3:0.000000 4:1.000000 5:0.012383 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.994191 12:0.081240 13:0.000000 14:0.774174 15:0.994196 16:0.003958 17:0.088235 18:0.142857 19:0.250000 20:0.004048 21:0.813038 22:0.954210 23:0.868413 24:0.914573 25:0.622796 26:0.426148 27:0.204424 28:0.397757 29:0.000000 30:0.000000 31:0.000000 32:0.000000 33:0.978268 34:1.000000 35:0.686586 36:1.000000 37:0.791811 38:1.000000 39:0.887732 40:1.000000 41:0.111111 42:0.336449 43:0.000000 44:0.000545 45:0.000789 46:0.002564 #docid = GX008-66-8698208 inc = 1 prob = 0.176849

请注意,这只有一行。数据集里是很多很多行的。
我用这个script一直提示:
引用:
Error to parse test.txt at line 1:

而我直接用那个匹配的句子去写个简单的程序,又发现匹配完全正常,以下是我写的script.
代码:
#!/usr/bin/perl
      my $_ = "0 qid:18219 1:0.052893 2:1.000000 3:0.750000 4:1.000000 5:0.066225 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.047634 12:1.000000 13:0.740506 14:1.000000 15:0.058539 16:0.003995 17:0.500000 18:0.400000 19:0.400000 20:0.004121 21:1.000000 22:1.000000 23:0.974510 24:1.000000 25:0.929240 26:1.000000 27:1.000000 28:0.829951 29:1.000000 30:1.000000 31:0.768123 32:1.000000 33:1.000000 34:1.000000 35:1.000000 36:1.000000 37:1.000000 38:1.000000 39:0.998377 40:1.000000 41:0.333333 42:0.434783 43:0.000000 44:0.396910 45:0.447368 46:0.966667 #docid = GX004-93-7097963 inc = 0.0428115405134536 prob = 0.860366\n";
      chomp($_);
        if ($_ =~ /^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/)
        {
            my $label = $1;
            my $qid = $2;
            my $did = $3;
            my $inc = $4;
            my $prob= $5;
         print "label is $label\nqid is $qid\ndid is $did\ninc is $inc\nprob is $prob\n";
        }
        else
        {
            print "Error to parse the line:\n$_\n";
            exit -2;
        };

结果就是:
引用:
label is 0
qid is 18219
did is GX004-93-7097963
inc is 0.0428115405134536
prob is 0.860366

吾百思不得其解,看了许多过于正则匹配的资料,也没发现什么特别的东西。
故在此发贴求教论坛中的perl高手,望不吝赐教...
:em42


_________________
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate


页首
 用户资料  
 
2 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-02 12:03 
头像

注册: 2008-03-23 0:39
帖子: 770
送出感谢: 0 次
接收感谢: 4
要不你加入个 print "[$lnFea]\n";在匹配前面看下吧。
你的脚本我不太会用。。。。 :em20


页首
 用户资料  
 
3 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-02 12:58 
头像

注册: 2010-10-16 10:03
帖子: 149
送出感谢: 0 次
接收感谢: 0 次
ChenFengyuan 写道:
要不你加入个 print "[$lnFea]\n";在匹配前面看下吧。
你的脚本我不太会用。。。。 :em20

谢谢你的回答,这下边是我按你说的加入后显示出$InFea的内容:
引用:
[0 qid:18219 1:0.052893 2:1.000000 3:0.750000 4:1.000000 5:0.066225 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.047634 12:1.000000 13:0.740506 14:1.000000 15:0.058539 16:0.003995 17:0.500000 18:0.400000 19:0.400000 20:0.004121 21:1.000000 22:1.000000 23:0.974510 24:1.000000 25:0.929240 26:1.000000 27:1.000000 28:0.829951 29:1.000000 30:1.000000 31:0.768123 32:1.000000 33:1.000000 34:1.000000 35:1.000000 36:1.000000 37:1.000000 38:1.000000 39:0.998377 40:1.000000 41:0.333333 42:0.434783 43:0.000000 44:0.396910 45:0.447368 46:0.966667 #doc]d = GX004-93-7097963 inc = 0.0428115405134536 prob = 0.860366

里边有两个错误,第一是第一个符号是多出来的(“[”);第二是docid而不是doc]d.
这究竟是怎么回事啊???
前边的第198行:
代码:
my $lnFea = <FIN_Feature>

意思不就是按行读取吗?


_________________
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate


页首
 用户资料  
 
4 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-02 14:26 
头像

注册: 2010-10-16 10:03
帖子: 149
送出感谢: 0 次
接收感谢: 0 次
应该是:
代码:
print "$lnFea\n";

print出来的结果是正确的
引用:
0 qid:18219 1:0.052893 2:1.000000 3:0.750000 4:1.000000 5:0.066225 6:0.000000 7:0.000000 8:0.000000 9:0.000000 10:0.000000 11:0.047634 12:1.000000 13:0.740506 14:1.000000 15:0.058539 16:0.003995 17:0.500000 18:0.400000 19:0.400000 20:0.004121 21:1.000000 22:1.000000 23:0.974510 24:1.000000 25:0.929240 26:1.000000 27:1.000000 28:0.829951 29:1.000000 30:1.000000 31:0.768123 32:1.000000 33:1.000000 34:1.000000 35:1.000000 36:1.000000 37:1.000000 38:1.000000 39:0.998377 40:1.000000 41:0.333333 42:0.434783 43:0.000000 44:0.396910 45:0.447368 46:0.966667 #docid = GX004-93-7097963 inc = 0.0428115405134536 prob = 0.860366

我更搞不懂是怎么回事了...
求高手~~~ :emb2


_________________
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate


页首
 用户资料  
 
5 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-02 15:07 
头像

注册: 2010-10-16 10:03
帖子: 149
送出感谢: 0 次
接收感谢: 0 次
刚刚有试了下,发现只要文件是windows line ending,就会发生这种错误。
把它改成unix line ending就好了。
一个莫名其妙的bug...
感谢关注 :em11 :em11 :em11
:em04 :em04 :em05 :em05


_________________
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate


页首
 用户资料  
 
6 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-02 23:26 
头像

注册: 2008-03-23 0:39
帖子: 770
送出感谢: 0 次
接收感谢: 4
我一般都用[]啥的包裹下。这样可以看出来呢
不过用YAML模块的,Dump函数更好
比如
perl -MYAML -e 'print Dump "a\rb\n"'
结果是
--- "a\rb\n"
把特殊的都打印出来,这样比较好:)

呵呵。我当时只想到了。用正则前,要匹配的和预期的不符合,就想打印下看看。
现在看来。换行符真是正则杀手呢。呵呵。


页首
 用户资料  
 
7 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-02 23:28 
头像

注册: 2008-03-23 0:39
帖子: 770
送出感谢: 0 次
接收感谢: 4
会用irc么?
可以到#ubuntu-cn来交流阿。这样解决问题快点。
尤其是提示性的问题:)


页首
 用户资料  
 
8 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-03 10:55 
头像

注册: 2010-10-16 10:03
帖子: 149
送出感谢: 0 次
接收感谢: 0 次
ChenFengyuan 写道:
会用irc么?
可以到#ubuntu-cn来交流阿。这样解决问题快点。
尤其是提示性的问题:)

还没用过呵呵,我去搞个哈
谢谢你~~


_________________
Ubuntu11.04 64bit + Gnome 3 完美
Windows7 64 Ultimate


页首
 用户资料  
 
9 楼 
 文章标题 : Re: Perl高手请进~求教
帖子发表于 : 2011-01-17 17:46 

注册: 2010-10-31 9:15
帖子: 507
系统: kubuntu 16.04
送出感谢: 0 次
接收感谢: 13
windows line ending 行的最后隐式包含‘换行符’和‘回车符’
unix只包含一个换行符


_________________
百度网盘 2048G容量 大放送!
百度网盘资源论坛一键保存资源!


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译