找回密码
 加入
搜索
查看: 181|回复: 7

[系统综合] 中文数字正则提取,请教。(已解决)

[复制链接]
发表于 2026-1-24 04:33:43 | 显示全部楼层 |阅读模式
本帖最后由 5735988 于 2026-1-24 12:04 编辑

123 452 125 785 354 小明正一负二学分
123 452 125 785 354 小明正1负2学分
123 452 125 785 354 小李正三负二学分
123 452 125 785 354 小王正5负3学分

123 452 125 785 354 一正二负学分小明
学分123 452 125 785 354 三正二负小李
学分123 452 125 785 354  5正3负学分小王   ;有可能会出现数字, 但是每行都有  正负两个字   或者负正   

上面数字不固定,我想提取替换一下,
结果: 数字(正一   负二)学分小明,其他位置不变      中间放个空格就好,
结果: 数字(一正   二负)学分小王,其他位置不变      中间放个空格就好,
结果: 数字(5正   3负)学分小王,其他位置不变      中间放个空格就好,
结果: 数字(15正   23负)学分小王,其他位置不变      中间放个空格就好,
#include <Array.au3>

;~ $arrays = StringRegExp($str, '\D(\V?)正(\V)负', 2)
;~ If @extended Then
;~         _zhuan_Huan()
;~         $str = StringReplace($str, "正", " 正 ")
;~ EndIf


 楼主| 发表于 2026-1-24 04:36:08 | 显示全部楼层
(\V)正(\V)负
(\V)负(\V)正

这个正则都不对。。
发表于 2026-1-24 11:11:33 | 显示全部楼层
本帖最后由 gyp2000 于 2026-1-24 11:14 编辑


Local $sText = "需要处理的数据"

$sText = StringRegExpReplace($sText, '(正[一|二|三])(负[一|二|三])', ' \1  \2  ')
$sText = StringRegExpReplace($sText, '([一|二|三]正)([一|二|三]负)', ' \1  \2 ')
$sText   = StringRegExpReplace($sText , '(学分)', ' \1 ')
......
先用正则替换将关键字之间替换出空格。
然后将数据使用空格作为分隔符转换成二维数组。
最后检查数组中的每个元素,判断数据类型后格式化输出。
 楼主| 发表于 2026-1-24 12:03:49 | 显示全部楼层
gyp2000 发表于 2026-1-24 11:11
Local $sText = "需要处理的数据"

$sText = StringRegExpReplace($sText, '(正[一|二|三])(负[一|二|三]) ...

老哥,这个代码对我很重要。谢谢。
发表于 2026-1-24 12:37:36 | 显示全部楼层
5735988 发表于 2026-1-24 12:03
老哥,这个代码对我很重要。谢谢。

Local $sText = '123 452 125 785 354 小明正一负二学分' & @CRLF
$sText &= '123 452 125 785 354 小明正1负2学分' & @CRLF
$sText &= '123 452 125 785 354 小李正三负二学分' & @CRLF
$sText &= '123 452 125 785 354 小王正5负3学分' & @CRLF
$sText &= '123 452 125 785 354 一正二负学分小明' & @CRLF
$sText &= '学分123 452 125 785 354 三正二负小李' & @CRLF
$sText &= '学分123 452 125 785 354  5正3负小王' & @CRLF
$sText = StringRegExpReplace($sText , '(学分)', '')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)(正[一|二|三])(负[一|二|三])(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)([一|二|三]正)([一|二|三]负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)(\d+正)(\d+负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\s?){5})(.*)(正\d+)(负\d+)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
ConsoleWrite($sText)
发表于 2026-1-24 12:55:01 | 显示全部楼层
如果数字之间的空格数量有多有少 可以用 \h*

$sText = StringRegExpReplace($sText , '(学分)', '')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)(正[一|二|三])(负[一|二|三])(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)([一|二|三]正)([一|二|三]负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)(\d+正)(\d+负)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
$sText = StringRegExpReplace($sText, '((\d{1,3}\h*){5})(.*)(正\d+)(负\d+)(.*)', '结果:\1 \(\4 \5\) 学分\6\3')
 楼主| 发表于 2026-1-24 13:03:00 | 显示全部楼层
gyp2000 发表于 2026-1-24 12:55
如果数字之间的空格数量有多有少 可以用 \h*

$sText = StringRegExpReplace($sText , '(学分)', '')

数学 123  234  567  345   023   146  学分 5分
数学 123  234  567  345   023   121   5学分 学分
语文 453  234  527  365   023   181   6分 学分
语文 453  234  567  345   023   131  共8学分 学分


还有一组数据,上面的数字,一定是3个数字一起的

我想吧最后那个5分  6分  转换成大写的 五分  六分   八分

就是后面数字 转换成大写的  一二三四五六七八九。

前面的三个连续数字不动

结果:数学 123  234  567  345   023   146  学分 五分


dim $str ,$arrays

$arrays = "语文 453  234  567  345   023   131  共8学分 学分"

$arrays = StringRegExp($str, '语文(\V+)分', 2)
If @extended Then
        $sText1 = $arrays[UBound($arrays[0])]
        $sText = StringReplace($sText1, "11", "十一")
        $sText = StringReplace($sText, "12", "十二")
        $sText = StringReplace($sText, "13", "十三")
        $sText = StringReplace($sText, "14", "十四")
        $sText = StringReplace($sText, "15", "十五")
        $sText = StringReplace($sText, "16", "十六")
        $sText = StringReplace($sText, "17", "十七")
        $sText = StringReplace($sText, "18", "十八")
        $sText = StringReplace($sText, "19", "十九")
        $sText = StringReplace($sText, "20", "二十")
        $sText = StringReplace($sText, "10", "十")
        $sText = StringReplace($sText, "1", "一")
        $sText = StringReplace($sText, "2", "二")
        $sText = StringReplace($sText, "3", "三")
        $sText = StringReplace($sText, "4", "四")
        $sText = StringReplace($sText, "5", "五")
        $sText = StringReplace($sText, "6", "六")
        $sText = StringReplace($sText, "7", "七")
        $sText = StringReplace($sText, "8", "八")
        $sText = StringReplace($sText, "9", "九")
        $str = StringReplace($str, $sText1, $sText)
EndIf


MsgBox(4096, "正则测试 标志值 3 - " , $str )
 楼主| 发表于 2026-1-24 13:06:26 | 显示全部楼层
用分割不知道行不行?  先把前面的 连续3个数字提取为  第一段,   后面的在转换,这个应该可以。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2026-2-18 16:36 , Processed in 0.123345 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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