Byron's log
‹‹ back
python-正则
Create Time : 2011-06-08 09:32:19
Modify Time : 2011-06-10 10:59:13
python的正则还是比较简单的,但是有一个恶心的是re模块里的sub方法就是替换,而写过c写过php的人都知道sub是截节的方法。

下面是一些例子:

# 标题
content = re.sub(r"(?m)^=(.+?)=\s",r"<h2>\1</h2>",content)

# 代码块
content = re.sub(r"(?s):::\s+(.+?):::\s",self.escape_html,content)

# 简单列表
content = re.sub(r"(?m)^\*\s(.+?)\s+$",r"<ul><li>\1</li></ul>",content)
content = re.sub(r"\<\/ul\>\s*\<ul\>",r"",content)
  • 表达示字符串一定要申明为r。
  • (?x)是python正则的模式语法
  • sub是支持回调函数的,默认为传递一个match对象,而在match对象中的group(x)方法,获得组。
对于正则的快速入门,在网上找了一篇相当不错的文章

关于零宽断言的尝试

对于零宽断言有多难学,很多人痛苦,我到目前也在痛苦,可是有两个要点要记住,
  1. “零宽”!那么我们就把它想像成一把尖刀,因为锋口就是零宽的。
  2. 断言的位置,断言作为一个条件应用于正则其它部份的参照。例如:"ab",a是断言,那么就是a断言出现在其它正则b之前作为参照位子进行剩余匹配。
那么请看我的注释!注意竖线.(|) 正向
>>> s = "abcdefg"
>>> import re

# |abcdefg / (预测) abc存在位置,匹配从abc的 开始处 到\w+ 结束 的字符。
>>> r = re.sub(r"(?=abc)\w+",r"xxx",s)			
>>> r
'xxx'

# abc|defg / (回顾) abc存在位置,匹配从abc的 之后处 到\w+ 结束 的字符。
>>> r = re.sub(r"(?<=abc)\w+",r"xxx",s)			
>>> r
'abcxxx'

# |abcdefg / (预测) abc存在位置,匹配从abc的 开始处 到\w+ 开始处 的字符
>>> r = re.sub(r"\w+(?=abc)",r"xxx",s)			
>>> r
'abcdefg'

# abc|defg / (回顾) abc存在位置,匹配从abc的 之后处 到\w+ 开始处 的字符
>>> r = re.sub(r"\w+(?<=abc)",r"xxx",s)			
>>> r
'xxxdefg'

# a|bcdefg / (预测) bc存在位置,匹配bc的 开始外 到\w+ 结束 的字符。
>>> r = re.sub(r"(?=bc)\w+",r"xxx",s)			
>>> r
'axxx'

# abc|defg / (回顾) bc存在位置,匹配bc的 之后处 到\w+ 结束 的字符。
>>> r = re.sub(r"(?<=bc)\w+",r"xxx",s)			
>>> r
'abcxxx'

# a|bcdefg / (预测) bc存在位置,匹配bc的 开始外 到\w+ 开始 的字符。
>>> r = re.sub(r"\w+(?=bc)",r"xxx",s)			
>>> r
'xxxbcdefg'

# abc|defg / (回顾) bc存在位置,匹配bc的 之后处 到\w+ 开始 的字符。
>>> r = re.sub(r"\w+(?<=bc)",r"xxx",s)			
>>> r
'xxxdefg'
你明白了么?请注意断言本身断言位置剩余匹配,你行滴。 负向 关于负向零宽断言,就不想多说了,因为除了断言本身条件变化,断言位置和其它条件是一样的。