免费注册 查看新帖 |

Chinaunix

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

如何统计某字符串中,3个正则各出现几次? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-26 20:04 |只看该作者 |倒序浏览
比如
a$='12345abcdefghijk';

\d\d\d 出现了3次,
abc 出现了1次
xyz 出现了0次

能同时获取位置更好。

————————————————————

如果 \d\d\d 算出现1次,会简单些吗?
这个重叠倒不是重点。
_____________________________
实际问题是:
有一百左右的patten,像 [GT]AAT[AT][TGC]A 之类的, 需要在约5万条,长1k到10k的字符串中判断,
每条字符串中,前述的patten各出现了几次. 能标出位置更好.

[ 本帖最后由 galaxy001 于 2008-11-27 12:57 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-26 22:58 |只看该作者
感觉每个正则分别去判断会比较慢。

对于有几十上百个正则patten的情况,一般是如何减小运算量的?

论坛徽章:
0
3 [报告]
发表于 2008-11-27 01:27 |只看该作者
$string='12345abcd456efghijk\d\d\d';

print "123: " , 0+$string=~s/123/123/g , "\n";
print "45: " , 0+$string=~s/45/45/g , "\n";
print '\d: ' , 0+$string=~s/\\d/\\d/g , "\n";
print "xyz: " , 0+$string=~s/xyz/xyz/g , "\n";



输出
123: 1
45: 2
\d: 3
xyz: 0

我用的是比较傻的办法 用xyz对去全文替换xyz
s/xyz/xyz/g 在标量上下文返回就会返回匹配次数

至于想要知道匹配位置,那我建议你还是用
index string, substring, start_position


[ 本帖最后由 StephenHuu 于 2008-11-27 01:30 编辑 ]

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
4 [报告]
发表于 2008-11-27 09:50 |只看该作者
原帖由 StephenHuu 于 2008-11-27 01:27 发表
$string='12345abcd456efghijk\d\d\d';

print "123: " , 0+$string=~s/123/123/g , "\n";
print "45: " , 0+$string=~s/45/45/g , "\n";
print '\d: ' , 0+$string=~s/\\d/\\d/g , "\n";
print "xyz: " , ...

关于位置可以perldoc perlvar 看看 @+, @-, $+等变量。

论坛徽章:
0
5 [报告]
发表于 2008-11-27 12:05 |只看该作者
一般来说,是每个patten都用一次s///好,还是用 | 把所有patten并列后再看找到的是哪个好?

论坛徽章:
0
6 [报告]
发表于 2008-11-27 12:17 |只看该作者
原帖由 galaxy001 于 2008-11-27 12:05 发表
一般来说,是每个patten都用一次s///好,还是用 | 把所有patten并列后再看找到的是哪个好?


我觉得这个一定要具体问题具体分析的。你还不如把你的问题完整地贴出来。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2008-11-27 12:37 |只看该作者
多个pattern有时候没法一起匹配

论坛徽章:
0
8 [报告]
发表于 2008-11-27 12:45 |只看该作者
有一百左右的patten,像 [GT]AAT[AT][TGC]A 之类的, 需要在约5万条,长1k到10k的字符串中判断,
每条字符串中,前述的patten各出现了几次. 能标出位置更好.

论坛徽章:
0
9 [报告]
发表于 2008-11-27 12:47 |只看该作者
原帖由 ynchnluiti 于 2008-11-27 12:37 发表
多个pattern有时候没法一起匹配


(\d\sATA)|(\w\dGTA)|(^AT.*$)
这样的不行吗? (这会在寝室,没法测试)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP