正则取文本模块——取两个字符串之间的文本
说明:
1、取两个字符串之间的文本,并返回所有符合要求的文本及其所在位置。
2、返回值类型为模块中自定义的“正则取文本结果”类型,该类型有两个数组成员,分别放置匹配的文本及位置。
3、使用时请先定义一个类型为“正则取文本结果”的变量以便获取返回值,具体看例程。
4、本模块只是简单封装了一种主要的正则表达式,并不能实现正则表达式的所有功能。
5、封装的主要表达式格式为:(?<=左内容)((?!不包含).)*?(?=右内容)
因 为用的是易语言本身的正则引擎,当参数文本以全角字符开始时,可能会造成乱码。原因是一个全角字符是两个字节,比如当两个汉字在一起时,第一个汉字的第二 个代码和第二个汉字的第一个代码合在一起可能会是另外一个汉字,这时以这个汉字为参数时,可能会取到那两个汉字的各一半,造成乱码。具体使用的时候注意排 除这个可能性。
解释一下“不包含”参数的用途:
不包含的意思是不获取包含“不包含”字符串的文本。比如:aaabccdeee,取“a”与“e”之间的文本——
1、当不包含为空时,获取的是“bccd”(前面的两个a和后面的两个e被忽略);
2、当不包含为"c"时,取出的是空文本,意思是这个字符串已经包含“c”了,就忽略掉了;
3、当不包含文本不在所取文本之间时,返回的结果跟第一个一样。
如果需要排除所获取文本的中间字符串,可以在获取之后用文本替换将中间字符串替换为空。比如要排除“cc”,先让不包含参数为空,获取a与b之间的“bccd”,然后用子文本替换("bccd","cc","",,,真),得到需要的“bd”。
.程序集 程序集1
.子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码
_临时子程序 () ' 在初始化代码执行完毕后调用测试代码
返回 (0) ' 可以根据您的需要返回任意数值
.子程序 _临时子程序
.局部变量 返回结果, 正则取文本结果
.局部变量 i
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
返回结果 = 正则取文本 (“
AC |
BC |
DC |
”,“”,“ | ”,“B”)
.计次循环首 (取数组成员数 (返回结果.文本), i)
输出调试文本 (返回结果.文本 [ i ] +“, ” + 到文本 (返回结果.位置 [ i ]))
.计次循环尾 ()
.子程序 正则取文本, 正则取文本结果, 公开, 定义一个类型为“正则取文本结果”变量获取返回值
.参数 原内容, 文本型, , 欲取其部分的原文本
.参数 左内容, 文本型, 可空, 欲取文本前面的文本
.参数 右内容, 文本型, 可空, 欲取文本后面的文本
.参数 不包含, 文本型, 可空, 欲取文本不包含该文本
.局部变量 特殊字符, 文本型, , "0"
.局部变量 左边内容, 文本型
.局部变量 右边内容, 文本型
.局部变量 不含内容, 文本型
.局部变量 表达文本, 文本型
.局部变量 正则表达, 正则表达式, , , 格式:(?<=左内容)((?!不包含).)*?(?=右内容)
.局部变量 搜索结果, 搜索结果, , "0"
.局部变量 返回结果, 正则取文本结果
.局部变量 i
特殊字符 = {“\”,“.”,“*”,“+”,“?”,“^”,“$”,“(”,“)”,“[”,“]”,“{”,“}”,“|” }
左边内容 = 左内容
右边内容 = 右内容
不含内容 = 不包含
.计次循环首 (取数组成员数 (特殊字符), i)
左边内容 = 子文本替换 (左边内容, 特殊字符 [ i ],“\” + 特殊字符 [ i ], , , 真)
右边内容 = 子文本替换 (右边内容, 特殊字符 [ i ],“\” + 特殊字符 [ i ], , , 真)
不含内容 = 子文本替换 (不含内容, 特殊字符 [ i ],“\” + 特殊字符 [ i ], , , 真)
.计次循环尾 ()
.判断开始 (左边内容 =“”)
.如果 (取代码 (取文本左边 (原内容, 1), ) < 0)
左边内容 = 取文本左边 (原内容, 2)
.否则
左边内容 = 取文本左边 (原内容, 1)
.如果结束
左边内容 =“^” + 左边内容
.默认
左边内容 =“(?<=” + 左边内容 +“)”
.判断结束
.判断开始 (右边内容 =“”)
.如果 (取代码 (取文本右边 (原内容, 1), ) < 0)
右边内容 = 取文本右边 (原内容, 2)
.否则
右边内容 = 取文本右边 (原内容, 1)
.如果结束
右边内容 = 右边内容 +“$”
.默认
右边内容 =“(?=” + 右边内容 +“)”
.判断结束
.判断开始 (不含内容 =“”)
表达文本 =“.*?”
.默认
表达文本 =“((?!” + 不含内容 +“).)*?”
.判断结束
表达文本 = 左边内容 + 表达文本 + 右边内容
' 输出调试文本 (表达文本)
.如果真 (取反 (正则表达.创建 (表达文本, )))
清除数组 (返回结果.文本)
清除数组 (返回结果.位置)
返回 (返回结果)
.如果真结束
搜索结果 = 正则表达.搜索全部 (原内容)
重定义数组 (返回结果.文本, 假, 取数组成员数 (搜索结果))
重定义数组 (返回结果.位置, 假, 取数组成员数 (搜索结果))
.计次循环首 (取数组成员数 (搜索结果), i)
返回结果.文本 [ i ] = 搜索结果 [ i ].取匹配文本 (原内容, 返回结果.位置 [ i ])
.计次循环尾 ()
返回 (返回结果)
======
实例
a = '12345678'
b = re.sub(r"(?<=\d)(?=(\d{3})+\b)",",",a)
print b
这段正则表达式什么意思 不是很懂 求解释
输出结果12,345,678
(?<=\d)(?=(\d{3})+\b)表示匹配一个前面是数字(?<=\d),后面是3个3个的数字(?=(\d{3})+\b)的这样一个间隔位置。
然后sub函数把这些位置替换为",",所以输出结果就是那样啦。
阅读(3367) | 评论(0) | 转发(0) |