找回密码
 加入
搜索
查看: 9175|回复: 14

[效率算法] 检测字符串是否双拼,三拼等。

 火.. [复制链接]
发表于 2013-11-16 14:08:20 | 显示全部楼层 |阅读模式
比如检查某个网址是不是双拼或三拼,
例如www.baidu.com  就是由bai,du,双拼组成的。
www.woaini.com  wo,ai,ni 三拼组成。
目前有几千个网址,要怎么检测呢。
发表于 2013-11-16 18:18:14 | 显示全部楼层
可以根据汉字拼音的规律用正则检测。
代码只提供大概思路,请自行完善。
Local $str = 'www.baidu.com'
Local $str2 = 'woaini.com'
MsgBox(0, $str, _get_Domain_PY_counts($str))
MsgBox(0, $str2, _get_Domain_PY_counts($str2))

Func _get_Domain_PY_counts($sDomain)
        If Not StringInStr($sDomain, '.') Then Return SetError(1, '', 0)
        Local $aArray
        Local $pattern = '((?:[bcdfghjklmnpqrstwxyz]{0,2})[aeiouv]{1,2}(?:[ng]{0,2}))'
        If StringInStr($sDomain, 'www') Then 
           $sDomain = StringRegExpReplace($sDomain, 'www\.(\w+)\..+', '\1')
    Else
           $sDomain = StringRegExpReplace($sDomain, '\..+', '')
    EndIf
        $aArray = StringRegExp($sDomain, $pattern, 3)
        Return UBound($aArray)
EndFunc

评分

参与人数 2威望 +2 金钱 +50 贡献 +5 收起 理由
skyfree + 10 膜拜大神
pusofalse + 2 + 40 + 5 学习了。

查看全部评分

 楼主| 发表于 2013-11-16 20:46:52 | 显示全部楼层
回复 2# user3000


大哥,你太牛了。一个正则就搞定了。我想了一整天,用了很多方法,最后是做出来了,不过使用好几个FOR循环,然后用拼音字库才搞定的。速度慢得要死,1分钟只能检测200多条记录。你这个正则1分钟估计几千条没问题啊。 太牛了,帮到我大忙了。感谢啊。
 楼主| 发表于 2013-11-16 21:08:51 | 显示全部楼层
回复 2# user3000


   这个判断拼音的正则还是有点问题,比如 字符串"lawegkjwlgekjls"这个也检测出是拼音了。
正则匹配后  变成拼音 la,weg,lge,这样了。
 楼主| 发表于 2013-11-16 21:23:39 | 显示全部楼层
woaini用你那正则 ((?:[bcdfghjklmnpqrstwxyz]{0,2})[aeiouv]{1,2}(?:[ng]{0,2})) 匹配后变成
woa,in,i 了
发表于 2013-11-17 00:19:04 | 显示全部楼层
回复 5# netsmu

我拼音其实不怎么过关,打字也是用的五笔!
确实,拼音不存在“we"之类;所以正则表达式还得完善。
可能要按所有韵母来细分表达式?

还是2楼所说的,”只提供大概思路“!
发表于 2013-11-17 06:46:48 | 显示全部楼层
本帖最后由 netegg 于 2013-11-17 06:47 编辑

按元音拆呢,只是个想法,可能也不大方便
 楼主| 发表于 2013-11-17 10:10:48 | 显示全部楼层
期待正则高手,能来个拼音的匹配啊。。。。。
发表于 2013-11-17 10:59:04 | 显示全部楼层
不知道怎么形容啦,这样试下呢
$str = 'www.baidu.com'
$str2 = 'woaini.com'
$str3='lawegkjwlgekjls'
ConsoleWrite(test($str)&@CRLF)
ConsoleWrite(test($str2)&@CRLF)
ConsoleWrite(test($str3)&@CRLF)

Func test($sDomain)
        Local $pattern = '(?ms)(((z|c|s)h?|b|p|m|f|d|t|n|l|g|k|h|j|q|x|r|y|w)?((o|i|e|a)ng|(v|u|e|a|i)n|er|ve|i(e|i)|ou|ao|(u|e|a)i|v|u|i|e|o|a))'
        Return StringRegExpReplace(StringRegExpReplace($sDomain,$pattern," $1 "),"(^ +)|(?<= )( +)","")
EndFunc
 楼主| 发表于 2013-11-21 14:07:43 | 显示全部楼层
楼上的正则也不全,没有办法完全检测出拼音。
发表于 2013-11-21 16:35:11 | 显示全部楼层
回复 10# netsmu

正则不太行啊,还是弄多个FOR循环之类的吧,正则表达式列举下来起码几百长度,也影响执行效率的,关键是效果也一般

反感和方案这种区分也很难= =
发表于 2013-11-21 19:49:09 | 显示全部楼层
那就把所有的拼音都列出来嘛。。。。
在这里找的http://xh.5156edu.com/pinyi.html 删掉了一个单m 有单m这个拼音么?
不要看长 正则本身的效率还是不错的 1万组chuangqianmingyueguang也就100多毫秒
#AutoIt3Wrapper_UseX64=n
#include <array.au3>
Local $pattern="chuang|shuang|zhuang|chang|cheng|chong|chuai|chuan|guang|huang|jiang|jiong|kuang|liang|niang|qiang|qiong|shang|sheng|shuai|shuan|xiang|xiong|zhang|zheng|zhong|zhuai|zhuan|bang|beng|bian|biao|bing|cang|ceng|chai|chan|chao|chen|chou|chua|chui|chun|chuo|cong|cuan|dang|deng|dian|diao|ding|dong|duan|fang|feng|gang|geng|gong|guai|guan|hang|heng|hong|huai|huan|jian|jiao|jing|juan|kang|keng|kong|kuai|kuan|lang|leng|lian|liao|ling|long|luan|mang|meng|mian|miao|ming|nang|neng|nian|niao|ning|nong|nuan|pang|peng|pian|piao|ping|qian|qiao|qing|quan|rang|reng|rong|ruan|sang|seng|shai|shan|shao|shei|shen|shou|shua|shui|shun|shuo|song|suan|tang|teng|tian|tiao|ting|tong|tuan|wang|weng|xian|xiao|xing|xuan|yang|ying|yong|yuan|zang|zeng|zhai|zhan|zhao|zhei|zhen|zhou|zhua|zhui|zhun|zhuo|zong|zuan|ang|bai|ban|bao|bei|ben|bie|bin|cai|can|cao|cen|cha|che|chi|chu|cou|cui|cun|cuo|dai|dan|dao|den|dei|dia|die|diu|dou|dui|dun|duo|eng|fan|fei|fen|fou|gai|gan|gao|gei|gen|gou|gua|gui|gun|guo|hai|han|hao|hei|hen|hou|hua|hui|hun|huo|jia|jie|jin|jiu|jue|jun|kai|kan|kao|ken|kou|kua|kui|kun|kuo|lai|lan|lao|lei|lia|lie|lin|liu|lou|lue|lve|lun|luo|mai|man|mao|mei|men|mie|min|miu|mou|nai|nan|nao|nei|nen|nie|nin|niu|nou|nve|nuo|nun|pai|pan|pao|pei|pen|pie|pin|pou|qia|qie|qin|qiu|que|qun|ran|rao|ren|rou|rui|run|ruo|sai|san|sao|sen|sha|she|shi|shu|sou|sui|sun|suo|tai|tan|tao|tie|tou|tui|tun|tuo|wai|wan|wei|wen|xia|xie|xin|xiu|xue|xun|yan|yao|yin|you|yue|yun|zai|zan|zao|zei|zen|zha|zhe|zhi|zhu|zou|zui|zun|zuo|ai|an|ao|ba|bi|bo|bu|ca|ce|ci|cu|da|de|di|du|ei|en|er|fa|fo|fu|ga|ge|gu|ha|he|hu|ji|ju|ka|ke|ku|la|le|li|lu|lv|ma|me|mi|mo|mu|na|ne|ng|ni|nu|nv|ou|pa|pi|po|pu|qi|qu|re|ri|ru|sa|se|si|su|ta|te|ti|tu|wa|wo|wu|xi|xu|ya|ye|yi|yo|yu|za|ze|zi|zu|a|e|o|\S"
$array=StringRegExp("chuangqianmingyueguang",$pattern,3)
_ArrayDisplay($array,UBound($array))
$array=StringRegExp("lawegkjwlgekjls",$pattern,3)
_ArrayDisplay($array,UBound($array))
$array=StringRegExp("woaini",$pattern,3)
_ArrayDisplay($array,UBound($array))
发表于 2013-12-9 18:33:08 | 显示全部楼层
本帖最后由 wInkly_cc 于 2013-12-9 18:34 编辑
那就把所有的拼音都列出来嘛。。。。
在这里找的 删掉了一个单m 有单m这个拼音么?
不要看长 正则本身的效 ...
zch11230 发表于 2013-11-21 19:49



    正则:"an|chang"  测试"changchangchang"结果是“an,an,an”


不过细看了下,没有后者包含前者的。但是没留意部分包含
发表于 2013-12-9 19:31:52 | 显示全部楼层
回复 13# wInkly_cc
把被包含的放在后面试下, chang|an
发表于 2013-12-9 20:12:23 | 显示全部楼层
回复 13# wInkly_cc

很明显要把长的放前面 我都是故意排了序的  但是如果像 xian这种 你想拆分为西安 而不是仙的话 那就只有把表达式里面的xian|给删掉。
    如果要加入表达式里面没有的拼音  也得是几位数的字母就插入到相应的位置去。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-1 07:42 , Processed in 0.081059 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表