netbean 发表于 2011-4-29 07:53:55

文本减肥:正则[已解决]

本帖最后由 netbean 于 2011-5-5 23:35 编辑

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

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

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

3mile 发表于 2011-4-29 09:20:48

不懂股票

netbean 发表于 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)


谢谢。可是用这个代码返回不成功,请再帮忙看看

netbean 发表于 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})可以
但是如何包含其他特例呢?另外替换也不会

netbean 发表于 2011-4-29 13:04:25

本帖最后由 netbean 于 2011-4-29 13:14 编辑

(\d{6}).*?([\x{4e00}-\x{9fa5}]{2,4}\S{0,1})
改进了,继续

netbean 发表于 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
但放在程序中不成功

easefull 发表于 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

easefull 发表于 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

easefull 发表于 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)

easefull 发表于 2011-4-29 14:31:44

9楼的代码还是有问题,不过处理不了了:
000043 超 大 盘
超大盘中间有空格,导致只能取到一个超字

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

另外,继续膜拜3mile的\x

netbean 发表于 2011-4-29 14:51:28

谢谢各位帮忙,经测试还没成功

netbean 发表于 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        森远股份(最末位)

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

love5173 发表于 2011-4-29 15:05:18

回复 12# netbean
对股市不懂,什么叫深圳样式,楼主你可以贴一张处理完的格式,不用全部处理完 处理一部分的就可以

love5173 发表于 2011-4-29 17:40:01

这个不是单纯正则的问题了 晚上给你代码好吧,现在上班不好测试代码

love5173 发表于 2011-4-29 19:27:37

回复 12# netbean
你的文本是通过什么产生的?软件or网页
页: [1] 2 3 4 5
查看完整版本: 文本减肥:正则[已解决]