其实我已经使用Python的正则表达式很久了,今天看了Pycon2017的一个speech[2],又加深了理解。这是一个很简单的Speech,概括了Python正则表达式的用法以及一些Best Practice。
其实正则表达式常用的就那几种,熟悉了就很强大了:
- [ ] 表示都可以匹配,比如[abc]匹配a或b或c
- {1,3}表示重复1-3次
- [^abc]表示非abc
- 一些常用的匹配比如.*?表示非贪婪地匹配任何东西
现在已经有很多正则表达式教程了(包括基本上任何Python入门教程都会涉及正则表达式),这里就不多说。我对Python的正则有几个疑惑,在这个视频里面找到了答案。
一、永远使用r前缀。
python的r前缀表示原字符串(raw_string),就是字面意思的字符串,\并不表示转移。比如说r’\n’表示的是一个反斜杠,一个字母n。如果不加r即’\n’,那么\就表示转移,\和n一起表示一个换行符。可以理解为r'\n' == '\\n'
。
二、正则表达式中需要转义的字符。
三、Python正则表达式groups和group的区别。
详细解释在我的这个gist:https://gist.github.com/laixintao/1a550e98726ddbada0268f6b6a6490cf
group – 是获得所有的匹配,第0个是整个匹配的字符串,后面的是子匹配
groups – 是获得所有的子匹配,接受一个参数作为default。类似dict的get用法。
参考资料:
- PyCon Slides: https://drive.google.com/file/d/0BxJ4y96AC8m3NEpreVZLcDl0Nlk/view
- PyCon youtube: https://www.youtube.com/watch?v=abrcJ9MpF60&t=205s
我想请问一个问题,就是在您提供的 gist 中,有这样一行代码:
>>> m = re.match(r”(..)+”, “a1b2c3”) # Matches 3 times.
能请您解释一下为什么这里是匹配 3 次吗?
分别是 a1, b2, c3,但是每一次 match,都会把 group(1) 覆盖