懵了!女友突然问我什么是正则表达式

简介: 正则表达式相信大家应该都不陌生,本质上就是一种微小的、高度专业化的编程语言,使用它你可以为要匹配的可能字符串集指定规则。大多数编程语言正则语法基本相似,只是实现正则的函数库不同,今天就来跟大家一起了解下 Python 支持正则表达式的函数。

简单应用

正则最简单的应用,就是对字符串进行操作,用来找出想要匹配的字符串,比如 Python 就只会匹配字符串 Python ,当然也可以设置不区分大小写,这样就可以匹配更多,比如 pythonpyThon等。

如果还想来点复杂的匹配要怎么做,这就需要用到元字符了,下面就是所有的元字符:

// 元字符
  [ ] ( ) . ^ $ * + ? { }  \ |

元字符 [ ] \

这一对元字符主要用于指定字符类,也就是你想要匹配的一组字符。

比如:[asd] 就是要匹配任何字符 a, s, d,但如果想匹配 a b c d e …… x y z 是不是要把所有的都写一遍?当然不是了,这个我们可以写成 [a-z] 就行了,- 就是用来表示一个范围,再比如表示数字 1 至 9,可以写成 [1-9]

上面说的是包含的字符范围,如果想匹配不包含的范围要怎么做?这就要用到元字符 ^,比如匹配除了 n, u, 3 之外的字符,可以写成 [^nu3]

还有一点需要注意,在 [ ] 中的元字符会作为普通字符匹配,比如 [$+] 就会匹配 $, +

最后说下元字符 \,它的意义是用于转义所有元字符,也就是去掉元字符的特殊性,比如 \{\$\\,其实就是匹配字串 {, $, \

特殊字符类

上面说了 [a-z] 可以匹配所有小写字母,[0-9] 用来匹配所有数字,这样已经够简单了,还有更简单的几种特殊范围表达方式。

字符 说明
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d 相当于[0-9],即匹配一个数字字符。
\D 相当于[^0-9],即匹配一个非数字字符。
\s 相当于[\f\n\r\t\v],也就是匹配任何空白字符,包括空格、制表符、换页符等等。
\S 相当于[^\f\n\r\t\v],匹配任何非空白字符。
\w 相当于[a-zA-Z0-9_],匹配任何字母与数字字符。
\W 相当于[^a-zA-Z0-9_],匹配任何非字母与数字字符。

上面这些特殊序列可以包含在字符类中,比如 [\s\d,] 即匹配任何空白字符,数字和 ,

重复匹配 * + ?{m,n}

只是做到匹配字符串集合,肯定是不够的,它还有个更大的优势,那就是可以指定某一部分字符是重复的,并且可以指定重复的次数。

先说第一个表示重复的元字符 *,它用来指定前面一个字符可以重复0次或者多次。

比如 ap*le 将会匹配 apple,appple,ale 等等。

这里当重复正则时,匹配引擎会尝试尽可能多的重复它。当发现模式的后续部分不匹配,则匹配引擎将会回退并以较少的重复次数再次尝试。

另一个重复的元字符 +,它用来表示前一个字符可重复1次或多次。它跟 * 相比,其实就是少了一个重复0次,也就是上面 ap*le 换成 ap+le 不会出现匹配到 ale

第三个元字符就是 ?,它用来表示前一个字符可重复0次或1次,把上面的例子换成 ap?le,其实就是两个字符串 aleaple

最后一个复杂些就是 {m,n},这个表示前一个字符可重复次数是一个区间,也就是最少重复m次,最多重复n次。

例如 ap{2,3}le将会匹配 apple,appple 两个字符串,其他都不会匹配。

在这里需要注意下,m 需要小于 n,当然 mn 也是可以省略的。比如当 m=0 时,可以省略 m,当 n 为无穷大时,也可以省略 n。

如何使用?分两步

  1. 编译

对!你没看错,如果想使用正则表达式,首先得要把它编译成模式对象。编译成对象后,它就可以使用各种操作方法了,比如字串匹配查询或替换等。

Python 编译的方法是 re.compile('正则表达式'),比如 re.compile('ap?le')

当然也可以传一些特殊的参数,比如忽略大小写,那上面的编译方法就可以写成 re.compile('ap?le', re.IGNORECASE),这样在匹配字串时就可以忽略大小写了。

那除了这个还有别的参数吗?有,下面我把一部分常用的参数列出来,对了参数还可以简写,比如刚才使用的 re.IGNORECASE 可以简写成 re.I,这样就方便多了。

以下是常用编译参数:

参数 简写 说明
IGNORECASE I 忽略大小写
ASCII A 使几个转义(\w\b\s\d)匹配仅与具有相应特征属性的 ASCII 字符匹配
DOTALL S 使 . 匹配任何字符,包括换行符
LOCALE L 进行区域设置感知匹配
MULTILINE M 多行匹配,影响 ^$
VERBOSE X 忽略正则字符串中的空格,除非空格位于字符类中或前面带有未转义的反斜杠,可以组织和缩进,还可以写注释

大部分都容易理解,只是最后一个参数 VERBOSE 可能不太容易理解,这里给大家个官方的例子看下就理解了。

test = re.compile(r"""
 &[#]                # 数字开始部分
 (
     0[0-7]+         # 八进制
   | [0-9]+          # 小数形式
   | x[0-9a-fA-F]+   # 十六进制
 )
 ;                   # 结束分号
""", re.VERBOSE)
  1. 查找匹配

其实上面说的编译都只是在做准备,准备接下来要介绍的,正则表达式最重要的查询匹配。

常用匹配方法:

  • match():当是从字符串的开头开始匹配时使用,如匹配不上返回None
  • search():通过扫描字符串,来匹配字符串任意位置,如匹配不上返回None
  • findall():这个方法返回的是个列表,即所有匹配上的字符串列表;
  • finditer():这个和 findall() 相同,只是不是返回列表,而是一个 iterator。

上面这些方法,如果匹配成功,会返回一个对象实例,其中包含匹配相关的信息:起始和终结位置、匹配的子串以及其它信息。

// 示例代码
import re
ret = re.compile('[0-9]+') 
ret.match("apple")    // 返回 None   
ret.match("12189")   // 返回 <re.Match object; span=(0, 5), match='12189'>
ret.match("121ab")   // 返回 <re.Match object; span=(0, 3), match='121'>

总结

好了,今天我们简单介绍了下正则表达式,以及在 Python 中如何使用正则表达式,其实以上这些只是基础,后续还会为大家介绍更多。OK,今天就聊这些,如果你喜欢记得点 在看

目录
相关文章
|
6月前
开学之际被Turkey问候,只能祭出正则大法
开学之际被Turkey问候,只能祭出正则大法
24 0
|
6月前
|
数据采集 大数据 Python
学Python静不下来,看了一堆资料还是很迷茫是为什么
学Python静不下来,看了一堆资料还是很迷茫是为什么
62 2
学Python静不下来,看了一堆资料还是很迷茫是为什么
|
数据采集 XML 编解码
正则表达式学废了?xpath来救!
正则表达式学废了?xpath来救!
75 0
|
前端开发 JavaScript 数据安全/隐私保护
关于正则表达式,小黄人有话要说!!!
本文将带你逐步学习正则表达式的基础知识和高级技巧,从基本的元字符到实用的正则表达式示例,让你轻松掌握这一重要的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都能帮助你更好地理解和应用正则表达式。
115 0
关于正则表达式,小黄人有话要说!!!
|
前端开发 数据可视化 程序员
让学前端不再害怕英语单词(四)
前三章直通车↓↓↓ 让学前端不再害怕英语单词(一) 让学前端不再害怕英语单词(二) 让学前端不再害怕英语单词(三) 在第一章和第二章,我们大致讲了下前端三剑客和利用接口处理后端返回数据的一些单词,在第三章我们讲了css中的伪类和开发过程中要使用的一些单词,所以在第四章中,我们进一步系统的讲关于开发过程中使用的一些单词 如果有读者觉得哪部分的单词不熟悉的话,可以直接私信博主,博主会根据内容进行总结归纳
146 2
让学前端不再害怕英语单词(四)
|
前端开发 数据安全/隐私保护
让学前端不再害怕英语单词(三)
让学前端不再害怕英语单词(三)
149 2
让学前端不再害怕英语单词(三)
|
前端开发 JavaScript
让学前端不再害怕英语单词(二)
写了本专栏的第一章让学前端不再害怕英语单词(一)后,反响热度还是比较高的,截止现在已经有20个收藏量了,所以趁热打铁来更第二章 第一章我们简单的介绍了html,css和js的部分高频单词,因为html要记的关键点不多(就几个标签),所以html的单词到这里就结束了,本章继续介绍css和js的高频单词,并且对es6的部分高频单词进行一个介绍
131 1
让学前端不再害怕英语单词(二)
|
前端开发 JavaScript 索引
让学前端不再害怕英语单词(一)
有很多跟着我学习的学生经常跟我抱怨前端的单词很多,学了css又忘了html的单词,学了js又忘了css 的单词,所以本着给跟着我学习的学生提供一个学习前端不怕英语单词的课程,就打算写一篇博客去讲述如何增强在学习前端的时候巩固语法并且加强对英语单词的熟悉度 这一章节我们先讲下html,css和js的部分重点单词和联想记忆法
157 1
让学前端不再害怕英语单词(一)
|
数据采集 JavaScript 计算机视觉
正则什么的,你让我写,我会难受,你让我用,真香!
正则什么的,你让我写,我会难受,你让我用,真香!
|
机器学习/深度学习 Shell Linux
shell编程中十分重要的正则表达式(你若决定灿烂,山无遮,海无拦)
shell编程中十分重要的正则表达式(你若决定灿烂,山无遮,海无拦)
171 0
shell编程中十分重要的正则表达式(你若决定灿烂,山无遮,海无拦)