Python 2 和 3 的正则匹配


=Start=

缘由:

这个标题其实起的不太准确,因为Python 2 和Python 3中的官方正则模块re在不同版本中并没有什么不同,都支持的是Perl风格的正则语法,唯一的不同可能是在Python 3中字符串默认是Unicode,因此不会存在编码方面的问题,而Python 2则可能会有。

这里想记录就是最近碰到的一个比较有意思的正则匹配的case。

正文:

参考解答:

当前希望用Python将文档中包含「密码:123456」这种样式的内容用「xxx」进行批量替换,即:

data = """此处存放密码:abcdefg。

=
此处存放密码:112abcdef。

最后一行
"""

# 期望达到的替换效果如下:
data_new = """此处存放xxx。

=
此处存放xxx。

最后一行
"""

对应的Python代码如下:

import re

data = """此处存放密码:abcdefg。

=
此处存放密码:112abcdef。

最后一行
"""

print data

# Python 3
data_new = re.sub(r'密码[::=]{1}(<[^>]+>)*([a-zA-Z0-9\.\#\?\$\_\-\[\]\@\/\*\)]+)', 'xxx', data)
print(data_new)

# Python 2/3
data_new = re.sub(r'密码(:|:|=){1}(<[^>]+>)*([a-zA-Z0-9\.\#\?\$\_\-\[\]\@\/\*\)]+)', 'xxx', data)
print(data_new)

# Python 2
data_new = re.sub(u'密码[::=]{1}(<[^>]+>)*([a-zA-Z0-9\.\#\?\$\_\-\[\]\@\/\*\)]+)', 'xxx', data.decode('utf8'))
print(data_new)
# Python 2
data_new = re.sub(u'密码[::=]{1}(<[^>]{1,}>){0,}([a-zA-Z0-9\.\#\?\$\_\-\[\]\@\/\*\)]{1,})', 'xxx', data.decode('utf8'))
print(data_new)

经过测试和对比发现,这里的不同之处就在于在Python 2和Python 3中均可以用:

(:|:|=)

表示「中文冒号/英文冒号/英文等于号」中的任意一个。

但是对于(raw格式的字符串):

[::=]

只在Python 3中可行,在Python 2中进行unicode匹配要先对字符串进行显示转为utf8,否则达不到预期效果。

以上就是最近碰到的一个比较有意思的case,差点就中招了。。。

参考链接:

=END=

,

《“Python 2 和 3 的正则匹配”》 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注