=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,差点就中招了。。。
参考链接:
- Python下使用中文正则表达式
- python正则匹配中文
- Python2.x与3.x版本区别
- https://docs.python.org/2/howto/regex.html
- https://docs.python.org/3/howto/regex.html
- https://wiki.python.org/moin/Python2orPython3/
- https://pypi.org/project/regex/
=END=
《“Python 2 和 3 的正则匹配”》 有 1 条评论
关于Python编码这一篇文章就够了
http://www.bugcode.cn/2019/05/25/%E5%85%B3%E4%BA%8EPython%E7%BC%96%E7%A0%81%E8%BF%99%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B0%B1%E5%A4%9F%E4%BA%86/
`
获取有关字符编码和数字系统的概念
理解编码如何使用Python的str和bytes
通过int函数了解Python对数字系统的支持
熟悉Python字符编码和数字系统相关的内置函数
`
https://realpython.com/python-encodings-guide/