零基础到进阶,Python正则表达式详解

零基础到进阶,Python正则表达式详解

1. 正则表达式基础

1.1. 简单介绍

正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。

下图展示了使用正则表达式进行匹配的流程:

零基础到进阶,Python正则表达式详解

正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。

下图列出了Python支持的正则表达式元字符和语法:

零基础到进阶,Python正则表达式详解

1.2. 数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

1.3. 反斜杠的困扰

与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

1.4. 匹配模式

正则表达式提供了一些可用的匹配模式,比如忽略大小写、多行匹配等,这部分内容将在Pattern类的工厂方法re.compile(pattern[, flags])中一起介绍。

python 中的re 模块

正则表达式

就个人而言,主要用它来做一些复杂字符串分析,提取想要的信息

学习原则:够用就行,需要的时候在深入

现总结如下:

正则表达式中特殊的符号:

"." 表任意字符

"^ " 表string起始

"$" 表string 结束

“*” “+” “?” 跟在字符后面表示,0个——多个, 1个——多个, 0个或者1个

*?, +?, ?? 符合条件的情况下,匹配的尽可能少//限制*,+,?匹配的贪婪性

{m} 匹配此前的字符,重复m次

{m,n} m到n次,m,n可以省略

举个例子 ‘a.*b’ 表示a开始,b结束的任意字符串

a{5} 匹配连续5个a

[] 表一系列字符 [abcd] 表a,b,c,d [^a] 表示非a

| A|B 表示A或者B , AB为任意的正则表达式 另外|是非贪婪的如果A匹配,则不找B

(…) 这个括号的作用要结合实例才能理解, 用于提取信息

/d [0-9]

/D 非 /d

/s 表示空字符

/S 非空字符

/w [a-zA-Z0-9_]

/W 非 /w

一:re的几个函数

1: compile(pattern, [flags])

根据正则表达式字符串 pattern 和可选的flags 生成正则表达式 对象

生成正则表达式 对象(见二)

其中flags有下面的定义:

I 表示大小写忽略

L 使一些特殊字符集,依赖于当前环境

M 多行模式 使 ^ $ 匹配除了string开始结束外,还匹配一行的开始和结束

S “.“ 匹配包括‘/n’在内的任意字符,否则 . 不包括‘/n’

U Make /w, /W, /b, /B, /d, /D, /s and /S dependent on the Unicode character properties database

X 这个主要是表示,为了写正则表达式,更可毒,会忽略一些空格和#后面的注释

其中S比较常用,

应用形式如下

import re

re.compile(……,re.S)

2: match(pattern,string,[,flags])

让string匹配,pattern,后面分flag同compile的参数一样

返回MatchObject 对象(见三)

3: split( pattern, string[, maxsplit = 0])

用pattern 把string 分开

>>> re.split('/W+', 'Words, words, words.')

['Words', 'words', 'words', '']

括号‘()’在pattern内有特殊作用,请查手册

4:findall( pattern, string[, flags])

比较常用,

从string内查找不重叠的符合pattern的表达式,然后返回list列表

好了,今天的知识就分享到这里,欢迎关注爱编程的南风,私信关键词:学习资料,获取更多学习资源,如果文章对你有有帮助,请收藏关注,在今后与你分享更多学习python的文章。同时欢迎在下面评论区留言如何学习python。

相关推荐