你是不是也遇到过这种情况。翻看别人的代码,看到一串像乱码的东西。
^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
这就是正则表达式。说实话我第一次看见它,脑袋嗡嗡的。这玩意是人写的吗。
后来自己写正则,更痛苦。写完后跑一下,不对。改一下,还不对。再改,程序直接报错了。那种感觉,就像你对着一个黑箱子使劲,不知道里面发生了什么。
我教编程课的时候,有个学生跟我说。老师,正则我放弃了。我问他为啥。他说,我写了半个小时,测试的时候发现少了个反斜杠,整个表达式就废了。我完全不知道问题在哪。
这个问题太真实了。正则表达式有个特点,差一个符号,结果就完全不一样。而且你看它的时候,它像个密文。你没法一步步调试它。
后来我发现了一个工具,叫pythex.org。这是个在线Python正则测试工具。它的好处特别直白。
你左边写正则,右边写要匹配的文本。下面会实时高亮显示匹配结果。你改一个字符,结果立刻变。就像你调颜色一样,动一下就看到了。
比如你写\d+想匹配数字。右边文本里的数字立刻就变绿了。如果你写错了,比如写成了\d+?,它只会匹配第一个数字。你能当场看到差别。
这个工具还能显示每个匹配的分组。你写括号的时候,它会帮你标出第1组第2组分别匹配了什么。这对搞懂复杂正则特别有帮助。
我以前讲正则课的时候,写一堆规则,学生还是懵。后来我让他们打开这个工具,自己动手试。很多人十分钟就搞明白了。因为他们能看到每一步的效果。
你去搜一下pythex,就能找到它。不用安装任何东西,打开浏览器直接用。它支持Python的正则语法,和re模块完全一样。
说个我自己的例子。有一次我要从一个网页里提取所有手机号。我写了一个正则1[3-9]\d{9}。在工具里测试的时候,发现它把一些错误的号码也匹配了。我仔细一看,原来是第一个数字后面没加边界判断。我加了个\b,立刻就对了。
要是没有这个实时反馈,我可能得反复运行代码,慢慢排查。那至少要多花半小时。
这个工具还能帮你学习。你想知道某个符号代表什么意思,可以直接在右边写个测试文本。比如写abc,右边写ac abc abbc abbbc。你能看到它匹配了哪些。这比翻教程快多了。
不管你是刚学正则的人,还是经常写正则的老手。这个工具都能省你很多时间。它让你看到正则的运行过程,不再是盲猜。
试试看。下次写正则的时候,别硬写。开个pythex,边写边测。你会发现正则没那么吓人。