Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88649
  • 博文数量: 13
  • 博客积分: 464
  • 博客等级: 一等列兵
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-02 17:38
文章分类

全部博文(13)

文章存档

2012年(7)

2011年(6)

我的朋友

分类: Python/Ruby

2011-11-23 14:34:29

正则取文本模块——取两个字符串之间的文本
说明:
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

' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。

返回结果 = 正则取文本 (“ACBCDC”,“”,“”,“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函数把这些位置替换为",",所以输出结果就是那样啦。
阅读(3335) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:python正则表达式匹配中文

给主人留下些什么吧!~~