让你的正则表达式可读性提高一百倍

    作者:匿名更新于: 2022-06-10 22:50:35

    大神带你学编程,欢迎选课

      有没有什么办法提高正则表达式的可读性呢?我们知道,提高代码可读性的方法之一就是写注释,那么正则表达式能不能写注释呢?

      正则表达式这个东西,强大是强大,但写出来跟个表情符号一样。自己写的表达式,过一个月来看,自己都不记得是什么意思了。比如下面这个:

      复制

      1. pattern = r"((?:\\(\\s*)?[A-Z]*H\\d+[a-z]*(?:\\s*\\+\\s*[A-Z]*H\\d+[a-z]*)*(?:\\s*[\\):+])?)(.*?)(?=(?:\\(\\s*)?[A-Z]*H\\d+[a-z]*(?:\\s*\\+\\s*[A-Z]*H\\d+[a-z]*)*(?:\\s*[\\):+])?(?![^\\w\\s])|$)"

      有没有什么办法提高正则表达式的可读性呢?我们知道,提高代码可读性的方法之一就是写注释,那么正则表达式能不能写注释呢?

      例如对于下面这个句子:

      复制

      1. msg = '我叫青南,我的密码是:123kingname456,请注意保密。'

      我要提取其中的密码123kingname456,那么我的正则表达式可能是这样的:

      复制

      1. pattern = ':(.*?),'

      我能不能把它写成这样:

      复制

      1. pattern = '''

      2. : # 开始标志

      3. (.*?) #从开始标志的下一个字符开始的任意字符

      4.  , #遇到英文逗号就停止

      5.  '''

      这样写就清晰多了,每个部分是什么作用全都清清楚楚。

      但显然直接使用肯定什么都提取不到,如下图所示:

      但我今天在逛Python正则表达式文档的时候,发现了一个好东西:

      使用它,可以让你的正则表达式拥有注释,如下图所示:

      re.VERBOSE​也可以简称为re.X,如下图所示:

      本文最开头的复杂正则表达式,使用了注释以后,就会变得更可读:

      复制

      1. pattern = r"""

      2. ( # code (capture)

      3. # BEGIN multicode

      4.

          5. (?: \\( \\s* )? # maybe open paren and maybe space

          6.

      7. # code

      8. [A-Z]*H # prefix

      9. \\d+ # digits

      10. [a-z]* # suffix

          11.

      12. (?: # maybe followed by other codes,

      13. \\s* \\+ \\s* # ... plus-separated

          14.

      15. # code

      16. [A-Z]*H # prefix

      17. \\d+ # digits

      18. [a-z]* # suffix

      19. )*

          20.

      21. (?: \\s* [\\):+] )? # maybe space and maybe close paren or colon or plus

          22.

      23. # END multicode

      24. )

          25.

      26. ( .*? ) # message (capture): everything ...

          27.

      28. (?= # ... up to (but excluding) ...

      29. # ... the next code

          30.

      31. # BEGIN multicode

          32.

      33. (?: \\( \\s* )? # maybe open paren and maybe space

          34.

      35. # code

      36. [A-Z]*H # prefix

      37. \\d+ # digits

      38. [a-z]* # suffix

          39.

      40. (?: # maybe followed by other codes,

      41. \\s* \\+ \\s* # ... plus-separated

          42.

      43. # code

      44. [A-Z]*H # prefix

      45. \\d+ # digits

      46. [a-z]* # suffix

      47. )*

          48.

      49. (?: \\s* [\\):+] )? # maybe space and maybe close paren or colon or plus

          50.

      51. # END multicode

          52.

      53. # (but not when followed by punctuation)

      54. (?! [^\\w\\s] )

          55.

      56. # ... or the end

      57. | $

      58. )

      59. """

      来源: 未闻Code

        >>>>>>点击进入编程语言专题

编程语言 更多推荐

课课家教育

未登录