文本减肥:正则[已解决]
本帖最后由 netbean 于 2011-5-5 23:35 编辑附件的文本想去掉多余字符,仅留代码,名称,试着用正则表达式替换不成功,请各位指教。谢谢
原文:600109 菳 国金证券 ?瓽uA GJZQ 600110 菳 中科英华 ? %?醶 A ZKYH
结果:600109 国金证券 600110 中科英华
不懂股票
本帖最后由 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)
谢谢。可是用这个代码返回不成功,请再帮忙看看 (\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})可以
但是如何包含其他特例呢?另外替换也不会 本帖最后由 netbean 于 2011-4-29 13:14 编辑
(\d{6}).*?([\x{4e00}-\x{9fa5}]{2,4}\S{0,1})
改进了,继续 本帖最后由 netbean 于 2011-4-29 13:59 编辑
(\d{6}).*?(\S{0,3}[\x{4e00}-\x{9fa5}]{2,4}\S{0,1})
查找OK
但放在程序中不成功 论坛有好几天没人出正则题目了
继续做题
解法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 论坛有好几天没人出正则题目了
继续做题
解法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 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) 9楼的代码还是有问题,不过处理不了了:
000043 超 大 盘
超大盘中间有空格,导致只能取到一个超字
同样,6楼的代码会错取000043的结果为上证中盘(上证中盘的正确代码是000044,000043正确的应该是超大盘).而000044则被跳过了.
另外,继续膜拜3mile的\x 谢谢各位帮忙,经测试还没成功 本帖最后由 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 森远股份(最末位)
重新整理出结果样式,除股票(第一位最末位之间)以外部分可删除。谢谢 回复 12# netbean
对股市不懂,什么叫深圳样式,楼主你可以贴一张处理完的格式,不用全部处理完 处理一部分的就可以 这个不是单纯正则的问题了 晚上给你代码好吧,现在上班不好测试代码 回复 12# netbean
你的文本是通过什么产生的?软件or网页