刚接触正则表达式的时候,脑袋里全是乱码一样的符号。那堆反斜杠加字母的组合,每次出现都像在嘲笑我的智商。我知道你不是一个人这么觉得。
很多人写代码多年,看到正则还是绕着走。宁愿写十行if语句,也不想碰那个r'^[A-Za-z]+$'。其实这事有窍门。今天跟大家分享五个实实在在的技巧,保证你看完就能用。
技巧一:从最长的字符串开始写模式。很多人一上来就想要万能匹配,结果把自己绕晕了。正确做法是,盯着你要匹配的具体文本,把最长最样板化的一句拿出来。比如你要匹配邮箱,先别想什么复杂规则。先看一个真实邮箱长什么样,user@example.com。然后从字符角度拆解,用户名部分有哪些字符,域名部分有哪些,点号在哪里。这样一步步来,开头就不会跑偏。
技巧二:用re.VERBOSE加注释。这个功能很多人不知道。正则写长了就像鬼画符,事后自己都看不懂。在re.compile里加上re.VERBOSE,你就能在里面写空格写注释了。
pattern = re.compile(r'''
^ 开头
[A-Z0-9._%+-]+ 用户名部分
@ 固定符号
[A-Z0-9.-]+ 域名部分
\. 点号
[A-Z]{2,} 顶级域名
$ 结尾
''', re.VERBOSE | re.IGNORECASE)
这样写出来,别人一看就懂,三个月后的你自己也能看懂。别怕代码长,长了才算人写的。
技巧三:用re.compile缓存模式。每次调用re.match('模式', 文本),Python都要重新解析一遍你的正则。如果你的代码里同一个正则用了好几次,就是在浪费性能。把正则编译成一个对象,后面直接调这个对象的方法。速度能快不少,代码也干净。
email_re = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}')
match = email_re.search(你的文本)
技巧四:不要滥用.。.是贪婪匹配,它会尽量多地吃掉字符。很多正则出bug都是这个惹的祸。你要匹配两个双引号之间的内容,用'.'的话,它会匹配从第一个引号到最后那个引号的全部内容,中间可能有好几对引号。这时候应该用'[^']',意思是不包含引号的任意字符。或者用.?加上问号变成非贪婪模式。多了这个问号,它的胃口就小了,只取最短的匹配。
技巧五:用在线工具先测试。别急着在代码里写。打开regex101.com或者类似的网站,把你要处理的数据贴上去,正则写好了就跑一下看看。高亮出了你想要的结果,再复制到代码里。这些工具还能帮你解释每个符号的作用。记得勾选Python选项,不用Python的口味不一样。一定要先在工具里跑通,别直接上代码调试,那是跟自己过不去。
这几个技巧不是什么秘籍,都是踩坑踩出来的经验。刚开始写正则,每个人都像看天书。多写几次,拆开来看,用工具辅助,这东西真不复杂。上手后你会觉得,以前用十行代码干的事,现在一行就搞定了,这种感觉很爽。
找一段你经常处理的数据,比如手机号或者商品编号,练练手。第一遍写不出来没关系,去翻翻速查表,看看例子,慢慢就顺了。不用着急,也没人规定你必须一次写对。