如何在python中使用正则表达式

  • .匹配除了换行符以外的任意字符。
  • *表示前面的内容可以连续重复任意次。
  • .*就表示匹配前面任意个除换行符外的字符组成的字符串。

简介

略过。讲讲我的心路历程吧

正则表达式这个我真的是拖了很久才开始接触的东西,现在终于避不过去了,现在有个要探测字符串中是否含有QQ表情emoji表情的任务。目标语言是python

简单模式

2.1 匹配字符

必须要掌握的是元符号metacharacter。这里有一个完整的元符号列表

  1. .
  2. ^
  3. $
  4. *
  5. +
  6. ?
  7. {
  8. }
  9. [
  10. ]
  11. \
  12. |
  13. (
  14. )

首先是[]这两个符号。它们用来表示一组符号,你希望用这组符号之一来匹配,这里面也可以表示一个范围,使用-来连接两个符号,来表示范围。例如[abc]可以匹配abc之一,这个相当于[a-c]

其他元符号在字符组中不再是元字符的概念。例如[amk$]会匹配下面的任意一个字符akm$

如果在字符组的第一个是一个^的话表示这个字符组会匹配不在这个字符组中的任何一个,如果是在外面的话就只是简单地匹配^这个字符。

\是一个转义符,加在元字符前会让这个元字符不在是元字符,而是简单地匹配它本身。类似python中的字符串。同时它也和一些符号也可以组成一些特殊的符号,来表示一些预先定义好的字符组。

  1. \d相当于[0-9]
  2. \D相当于[^0-9]
  3. \s相当于[\t\n\r\f\v],匹配所有空白字符
  4. \S相当于[^\t\n\r\f\v],匹配所有非空白字符
  5. \w相当于[a-zA-Z0-9_]
  6. \W相当于[^a-zA-Z0-9_]

这符号可以放在字符组中,例如[\s,.]可以匹配任何的非空白字符以及,.

还有一个元字符.表示匹配除了回车符号的字符。

2.2 重复的东西

元字符*并不匹配真正的符号*,相反的,它可以匹配让前面部分重复0至任意次数的字符串。遇到带元符号*的表达式,它会尽可能长地匹配子串。它会先尽量长地去先匹配,然后根据后面的字符来不断缩短自己的长度。

另一个可以重复的元字符是+,表示匹配一次或者多次。差别在于这个元字符至少得一次。

元字符?表示匹配一次或者零次。

最复杂的表示重复的元字符是{m,n}mn是两个整数,$m \leq n$。这个表示对应的部分最少重复m次,最多重复n次。如果m缺了,会自动补上0,如果n缺了,会认为可以最多重复无限多次。当然说无限多次,依然是由机器、软件等限制的。

3 使用正则表达式

首先要把正则表达式编译成一个object,然后在去match他们。

3.1 编译正则表达式

p=re.compile('ab*',re.IGNORECASE)可以忽略大小写。

3.2 backslash灾难

这里会产生很多的麻烦,而且让结果很难理解,因此可以使用字符的前缀r处理字符串,例如r"\n"不再是一个回车了,而是两个字符\n

3.3 匹配

  • match()如果没匹配,则返回None
  • search()如果没匹配,则返回None
  • findall()找到所有的匹配子串,然后返回一个list
  • finditer()找到所有的匹配子串,然后返回一个迭代器

我们可以从match object里面通过下面四个函数获得匹配的信息

  • group()返回匹配的字符串
  • start()`end()`返回开始和结束的位置
  • span()返回一个元组表示(start,end)

3.4 模块级别的函数

可以使用不创建re的object的调用方法,例如re.match(r'From\s+','Fromage amk'),这个方法会在cache中创建object。之后使用相同的RE的话速度会快。

3.5 解释标志

  • DOTALLS会让.匹配任何字符,包括换行符。
  • IGNORECASEI会忽略大小写来进行匹配。
  • LOCALEL这个会根据你的系统是哪个国家的,改变对应的字符集例如\w的字符范围
  • MULTITLINEM这个flag会影响到^$等符号
  • UNICODEU\w \W \b \B \d \D \s \S依靠Unicode,这个还有待考察
  • VERBOSEX这个可以在里面插入用#的注释

更多的模式

更多的元符号

  • \b是匹配一个词的边界
  • |是一个表示或的符号,但是它的优先级很低,这样可以让它的结果更合理,例如Crow|Servo表示的是匹配CrowServo中的其中一个,而不是wS中的一个。
  • ^表示匹配字符串的开端,如果有MULTILINE的标志的话,它也会匹配每个换行,如果只是想匹配在句子首部的单词From的话,可以使用的正则表达式是^From
  • $匹配的是句尾、行尾或者换行符号的后面的位置
  • \A在没有MULTILINE的情况下和^一样,但是在有MULTILINE的情况下也只匹配字符串首部
  • \Z无论什么情况下也都匹配字符串的尾部
  • \b前面已经介绍过了,但是这里要抢到一个很严重的冲突,如果没有在正则表达式的字符串前加上r的话,python会把\b处理成空格,这样就无法正常匹配了
  • \B则是匹配不是词的边界

4.2 Grouping

可以用()来讲许多字符当作一个整体,类似数学计算中的概念。

分享到