找回密码
 加入
搜索
查看: 24616|回复: 66

[效率算法] 文本减肥:正则[已解决]

 火.. [复制链接]
发表于 2011-4-29 07:53:55 | 显示全部楼层 |阅读模式
本帖最后由 netbean 于 2011-5-5 23:35 编辑

附件的文本想去掉多余字符,仅留代码,名称,试着用正则表达式替换不成功,请各位指教。谢谢

原文:600109       菳        国金证券                                                                                                                                                                                                   ?瓽uA   GJZQ     600110       菳        中科英华          ?                                                                                                                                                                                        %?醶 A   ZKYH     

结果:600109 国金证券 600110 中科英华

本帖子中包含更多资源

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

×
发表于 2011-4-29 09:20:48 | 显示全部楼层
不懂股票

本帖子中包含更多资源

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

×
 楼主| 发表于 2011-4-29 10:15:44 | 显示全部楼层
本帖最后由 netbean 于 2011-4-29 11:03 编辑
        $SNT = FileOpen(@MyDocumentsDir & "\SNT.txt", 2)
$S = FileRead($SNT)
$new = StringRegExpReplace($S, '(\d{6}).*?([\x{4e00}-\x{9fa5}]+)', '\1\2')
FileWrite($SNT, $new)
FileClose($SNT)


谢谢。可是用这个代码返回不成功,请再帮忙看看
 楼主| 发表于 2011-4-29 12:18:33 | 显示全部楼层
(\d{6}).*(\*ST[\x{4e00}-\x{9fa5}]{2})|(\d{6}).*(\*ST[\x{4e00}-\x{9fa5}]{2}\S)|(\d{6}).*(ST[\x{4e00}-\x{9fa5}]{2})|(\d{6}).*(ST[\x{4e00}-\x{9fa5}]{2}\S)|(\d{6}).*([\x{4e00}-\x{9fa5}]{4})|(\d{6}).*([\x{4e00}-\x{9fa5}]{3})|(\d{6}).*([\x{4e00}-\x{9fa5}]{3}\S)


写了个超长表达式,还是不行,估计要合并;

如果是最普通的样式,用(\d{6}).*([\x{4e00}-\x{9fa5}]{4})可以
但是如何包含其他特例呢?另外替换也不会
 楼主| 发表于 2011-4-29 13:04:25 | 显示全部楼层
本帖最后由 netbean 于 2011-4-29 13:14 编辑
(\d{6}).*?([\x{4e00}-\x{9fa5}]{2,4}\S{0,1})

改进了,继续
 楼主| 发表于 2011-4-29 13:23:02 | 显示全部楼层
本帖最后由 netbean 于 2011-4-29 13:59 编辑
(\d{6}).*?(\S{0,3}[\x{4e00}-\x{9fa5}]{2,4}\S{0,1})

查找OK
但放在程序中不成功
发表于 2011-4-29 13:55:39 | 显示全部楼层
论坛有好几天没人出正则题目了
继续做题

解法1:正则匹配,手动串连字符串
#include <Array.au3>
Local $sText =        '600109       菳        国金证券                                                                                                                                                                                                   ?瓽uA   GJZQ     600110       菳        中科英华          ?                                                                                                                                                                                        %?醶 A   ZKYH     '
Local $asResult = StringRegExp($sText, '(\d+)\s+\S\s+\S\s+(\S+)\s+', 3)
_ArrayDisplay($asResult)

Local $sResult = ""
Local $i = -2
Do
        $i += 2
        $sResult &= $asResult[$i] & @TAB & $asResult[$i+1] & @CRLF
Until $i = UBound($asResult) - 2
MsgBox(4096, "", $sResult)
Exit
发表于 2011-4-29 13:56:19 | 显示全部楼层
论坛有好几天没人出正则题目了
继续做题

解法2:直接正则替换
Local $sText =        '600109       菳        国金证券                                                                                                                                                                                                   ?瓽uA   GJZQ     600110       菳        中科英华          ?                                                                                                                                                                                        %?醶 A   ZKYH     '
Local $sResult = StringRegExpReplace($sText, '(\d+)(\s+\S\s+\S\s+)(\S+)([^\d]+)', '$1' & @TAB & '$3' & @CRLF)
MsgBox(4096, "", $sResult)
Exit
发表于 2011-4-29 14:23:03 | 显示全部楼层
8楼的解法好像有些问题,如果是附件文件里面的文本则无法跳过附件文件的第一行.

来第三个解法:先把整个文本分段,然后取需要的信息.
#include <Array.au3>
Local $sText    = FileRead("shex.tnf")
Local $asResult = StringRegExp($sText, '\d{6}\s+\S\s+\S\s+\S+', 3)
_ArrayDisplay($asResult)

Local $sResult = ""
For $i = 0 To UBound($asResult) - 1 Step 1
        $sResult &= StringRegExpReplace($asResult[$i], '(\d{6})(\s+\S\s+\S\s+)(\S+)', '$1' & @TAB & '$3' & @CRLF)
Next
MsgBox(4096, "", $sResult)
发表于 2011-4-29 14:31:44 | 显示全部楼层
9楼的代码还是有问题,不过处理不了了:
000043 超 大 盘
超大盘中间有空格,导致只能取到一个超字

同样,6楼的代码会错取000043的结果为上证中盘(上证中盘的正确代码是000044,000043正确的应该是超大盘).而000044则被跳过了.

另外,继续膜拜3mile的\x
 楼主| 发表于 2011-4-29 14:51:28 | 显示全部楼层
谢谢各位帮忙,经测试还没成功
 楼主| 发表于 2011-4-29 14:56:05 | 显示全部楼层
本帖最后由 netbean 于 2011-4-29 16:16 编辑

另外,样本中须补充深圳样式,这是全部数据




SH
600000        浦发银行(第一位)
600017        日照港
600074        *ST中达
600130        ST波导
600182        S佳通
600315        XD上海家
600603        ST兴  业
600610        SST中纺
600688        S上石化
601999        出版传媒(最末位)
SZ
000001        深发展A(第一位)
000002        万  科A
000010        S ST华新
000011        深物业A
000012        南  玻A
000017        *ST中华A
000018        ST中冠A
000509        S*ST华塑
000528        柳    工
000555        ST 太 光
002032        苏 泊 尔
002286        保龄宝
002578        闽发铝业(最末位)

创业板
300001        特锐德(第一位)
300210        森远股份(最末位)

重新整理出结果样式,除股票(第一位最末位之间)以外部分可删除。谢谢

本帖子中包含更多资源

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

×
发表于 2011-4-29 15:05:18 | 显示全部楼层
回复 12# netbean
对股市不懂,什么叫深圳样式,楼主你可以贴一张处理完的格式,不用全部处理完 处理一部分的就可以
发表于 2011-4-29 17:40:01 | 显示全部楼层
这个不是单纯正则的问题了 晚上给你代码好吧,现在上班不好测试代码
发表于 2011-4-29 19:27:37 | 显示全部楼层
回复 12# netbean
你的文本是通过什么产生的?软件or网页
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 02:07 , Processed in 0.084179 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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