下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:匿名     来源: 编程语言点击数:592发布时间: 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

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

赞(8)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程