必备技能之python正则表达式(一)

123 阅读6分钟

声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。

图片

主旨

python的风评,就不多说了,现在搞技术的人们几乎或多或少的都会点儿python,不管多少,总归是会点儿。但是我觉得最头疼的就是python的正则了,乱七八糟,而且没有一点儿顺序性,特别难记,所以这里整理下,以后也方便回忆查找,建议收藏。

环境

linux 环境
python3.0+ 环境

PS:如果不知道如何在linux上安装python3.0以上的版本,在公众号“运维家”后台回复“103”,即可获取安装操作手册。

概念

可能会有同学问,什么是正则表达式,为什么要掌握正则表达式,简单来说,正则表达式是为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。

太绕了是不是?换种说法就是,你可以通过正则表达式,来从一堆杂乱无序的字符中,提取到你需要的信息,比如手机号、美女、地址等信息。

最常用的

表示方法:
  re1|re2
解释:
  匹配正则表达式 re1 或者 re2
表达式示例:
  yunwei|jia
---------------------------------------------
表示方法:
  .
解释:
  匹配任何字符(除了\n之外)
表达式示例:
  a.a
---------------------------------------------
表示方法:
  ^
解释:
  匹配字符串起始部分
表达式示例:
  ^Dear
---------------------------------------------
表示方法:
  $
解释:
  匹配字符串终止部分
表达式示例:
  /bin/*sh$
---------------------------------------------
表示方法:
  *
解释:
  匹配0次或者多次前面出现的正则表达式
表达式示例:
  [A-Za-z0-0]*
---------------------------------------------
表示方法:
  +
解释:
  匹配一次或者多次前面出现的正则表达式
表达式示例:
  [a-z]+\.com
---------------------------------------------
表示方法:
  ?
解释:
  匹配0次或者一次前面出现的正则表达式
表达式示例:
  goo?
---------------------------------------------
表示方法:
  {N}
解释:
  匹配N次前面出现的正则表达式
表达式示例:
  [0-9]{5,9}

择一匹配符号

表示择一匹配的管道符号(|),也就是键盘上的竖线,表示一个“从多个模式中选择其一”的操作。它用于分割不同的正则表达式。例如:

表达式:
  abc|nihao
能匹配到的内容:
  abc和nihao

表达式:
  123a|888B
能匹配到的内容:
  123a和888B

表达式:
  abc|123|ggg
能匹配到的内容:
  abc、123、ggg 这三个都可以匹配到

匹配任意单个字符

点号或者句点(.)符号匹配除了换行符 \n 以外的任何字符。无论字母、数字、空格。

表达式:
  a.b
能匹配到的内容:
  匹配在字母 “a” 和 “b” 之间的任意一个字符,例如:aoba9ba#b

    那就有同学要问了,如何能匹配点号本身呢?我们其实可以使用反斜线转义句点符号的功能,例如 “\.”。

创建字符集

    尽管句点可以用于匹配任意字符,但某些时候,可能想要匹配某些特定字符。正因如此,发明了方括号。该正则表达式能够匹配一堆方括号中包含的任何字符,例如:

表达式:
  a[123]b
能匹配到的内容:
  a1b、a2b、a3b

表达式:
  [ab][12][cd][34]
能匹配到的内容:
  一个包含四个字符的字符集,第一个字符是 a 或者 b,第二个字符是 1 或者2,第三个字符是 c 或者 d,第四个字符是 3 或者4
  例如:a1c3,b2d1,a2c4

限定范围和否定

除了单字符以外,字符集还支持匹配指定的字符范围。方括号中两个符号中间用连字符 “-” 连接,用于指定一个字符的范围,例如:A-Z、a-z、0-9 分别用于表示大写字母、小写字母和数值数字。这是一个按照字母顺序的范围,所以不能将他们仅仅限定用于字母和十进制数字上。

另外,如果脱字符 “^” 紧跟在左方括号后面,这个符号就表示不匹配给定字符集中的任何一个字符。

例如:

表达式:
  Z.[0-9]
能匹配到的内容:
  字母“Z”后面跟着任何一个字符,然后跟着一个数字

表达式:
  [a-c][ego-r][yx]
能匹配到的内容:
  字母“a”,“b”,“c”后面跟着“e”,“g”,“o”,“p”,“q”,“r”,然后跟着“y”,“x”

表示字符集的特殊字符

我们还提到有一些特殊字符能够表示字符集,与使用“0-9”这个范围表示十进制数相比,可以简单地使用 (d) 表示匹配任何十进制数字。另一个特殊字符 (\w)能够用于表示全部字符数字的字符集,相当于 [A-Za-z0-9] 的缩写形式,(\s)可以用来表示空格字符。这些特殊字符的大写版本表示不匹配;例如:\D 表示任何非十进制数(与[^0-9]相同),等等。

使用这些缩写,可以表示如下一些更复杂的示例:

表达式:
  \w+-\d+
能匹配到的内容:
  一个由字母数字组成的字符串和一串由一个连字符分割的数字

表达式:
  [A-Za-z]\w*
能匹配到的内容:
  第一个字符是字母,其余字符(如果存在)可以是字母或者数字(几乎等价于python中的有效标识符)

扩展表示法

扩展表示法,它们是以问号开始(?...)。它们通常用于在判断匹配之前提供标记,实现一个前视(或者后视)匹配,或者条件检查。尽管圆括号使用这些符号,但是只有(?P)表述一个分组匹配。所有其他的都没有创建一个分组。

表达式:
  (?:\w+\.)*
能匹配到的内容:
  以句点作为结尾的字符串,例如:“google.”、“nihao.”,但是这些匹配不会保存下来供后续的使用和数据检索

表达式:
  (?#comment)
能匹配到的内容:
  此处并不做匹配,只是作为注释

表达式:
  (?=.com)
能匹配到的内容:
  如果一个字符串后面跟着“.com”才做匹配操作,并不使用任何目标字符串

表达式:
  (?!nihao)
能匹配到的内容:
  如果一个字符串后面不是跟着“nihao”才做匹配操作

表达式:
  (?<192\.168\.)
能匹配到的内容:
  如果一个字符串之前不是“192.168”才做匹配操作

至此,本文结束,下面我们会继续更新正则内容。

老板们,点个关注呗~~~