找回密码
 加入
搜索
楼主: 35888894

[效率算法] [已解决]求助,如何利用正则表达式获取一段文本中重复次数最多的字符串

 火.. [复制链接]
发表于 2012-3-30 00:07:52 | 显示全部楼层
如果不确定“两个或两个以上的字符组合”到底是几位,那无疑是位数越低的重复次数越高。
afan 发表于 2012-3-29 23:45



    嗯,的确是这样,所以楼主这个问题并不是很好的一个可以深入讨论的问题
可能他自己也没有深入想过吧,可以稍稍改一下,变成:
“删除字符串里的重复字符”就有意思多了
发表于 2012-3-30 09:18:19 | 显示全部楼层
本帖最后由 user3000 于 2012-3-30 09:32 编辑

无聊的产物, 只是跟正则沾点边, 其实用 StringInStr 更好吧.
原来的代码还有点错误,  现在已修正.
#include <array.au3>
Local $a = "anbancjffsanvdaf"
$a = "manbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahff"
;$a="manbanc12aaa3123jffsanadzwdanxsedffdffdffdffdffdffvdaf"
$array = _Get_Max_Substring($a)
_ArrayDisplay($array)

Func _Get_Max_Substring($str, $sLen = 2)
        Local $r[2] = [0, '']
        Local $len = StringLen($str)
        Local $offset, $count
        For $i = 1 To $len - $sLen + 1
                $subStr = StringMid($str, $i, $sLen)
                $count = 1
                $offset = 1
                While 1
                        StringRegExp($str, $subStr, 1, $offset)
                        If @error = 0 Then
                                $offset = @extended
                                $count += 1
                        Else
                                ExitLoop
                        EndIf
                WEnd
                If $count > $r[0] Then
                        $r[0] = $count
                        $r[1] = $subStr
                EndIf
        Next
        Return $r
EndFunc   ;==>_Get_Max_Substring

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

发表于 2012-3-30 09:41:11 | 显示全部楼层
本帖最后由 happytc 于 2012-3-30 09:42 编辑
无聊的产物, 只是跟正则沾点边, 其实用 StringInStr 更好吧.
原来的代码还有点错误,  现在已修正.
user3000 发表于 2012-3-30 09:18


效率有点低
我把你的Code中的字符串增加了拷贝了20次,计算时间就比较长了,我的机子上花了10秒


#include <array.au3>
Local $hInit = TimerInit()
Local $a ="manbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahff"
;$a="manbanc12aaa3123jffsanadzwdanxsedffdffdffdffdffdffvdaf"
$array = _Get_Max_Substring($a)
Local $iDiff = TimerDiff($hInit)
MsgBox(0, 0, $iDiff)
_ArrayDisplay($array)

Func _Get_Max_Substring($str, $sLen = 2)
        Local $r[2] = [0, '']
        Local $len = StringLen($str)
        Local $offset, $count
        For $i = 1 To $len - $sLen + 1
                $subStr = StringMid($str, $i, $sLen)
                $count = 1
                $offset = 1
                While 1
                        StringRegExp($str, $subStr, 1, $offset)
                        If @error = 0 Then
                                $offset = @extended
                                $count += 1
                        Else
                                ExitLoop
                        EndIf
                WEnd
                If $count > $r[0] Then
                        $r[0] = $count
                        $r[1] = $subStr
                EndIf
        Next
        Return $r
EndFunc   ;==>_Get_Max_Substring
 楼主| 发表于 2012-3-30 09:43:55 | 显示全部楼层
感谢大家热心的帮忙,问题搞定了。。。
解决方法1,在网上下了一个分词字典,大概28W个单词,但是auto的速度,你们懂的。。
解决方法2,后台调用这个http://www.ftphp.com/scws/demo/pscws23/demo.php
我觉得正则应该可以实现的,虽然心有不甘,但是苦于能力有限,呵呵,这里抛砖引玉,希望大家都能有所收获。
发表于 2012-3-30 10:01:42 | 显示全部楼层
对你的28W个单词的词典很有兴趣,能否上传下.
中文分词的话个人感觉ICTCLAS不错.
发表于 2012-3-30 10:02:17 | 显示全部楼层
效率有点低
我把你的Code中的字符串增加了拷贝了20次,计算时间就比较长了,我的机子上花了10秒
happytc 发表于 2012-3-30 09:41


我的正则与AU3一样都是入门级的,  效率啥的很多时候根本就是没做考虑.
或是根本做不到高效率哦.
 楼主| 发表于 2012-3-30 10:31:06 | 显示全部楼层
回复 20# 3mile

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-3-30 10:57:05 | 显示全部楼层
好玩的问题,难度很大.
只用正则搞不定.
以下代码只为抛个烂砖头,希望能引来好玉.
#include <Array.au3>
Local $Str = ''
$Str &= 'manbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
$Str &= 'a3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahffmanbanc12aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3123jffsanadzwdanxsedffdffdffdffdffdffvdahff'
Local $Test = StringRegExp($str, '(.{2})(?=[^\1]*\1)', 3)
_ArraySort($Test)

Local $Temp_Array[UBound($Test)][2]

For $i=0 To UBound($Test)-1
        $Temp_Array[$i][0]=$Test[$i]
        $Temp_Array[$i][1]=1
Next

For $i=0 To UBound($Test)-2
        If $Temp_Array[$i][0]==$Temp_Array[$i+1][0] Then
                $Temp_Array[$i][0]=''
                $Temp_Array[$i+1][1]=$Temp_Array[$i][1]+1
        EndIf
Next
_ArraySort($Temp_Array,1,0,0,1)
_ArrayDisplay($Temp_Array)
$output=StringRegExpReplace($str,$Temp_Array[0][0],'')
MsgBox(0,0,"出现最多的:"&$Temp_Array[0][0]&@CRLF&"次数:"&@extended)

评分

参与人数 2金钱 +55 收起 理由
35888894 + 30 学习了
afan + 25

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-19 09:38 , Processed in 0.089516 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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