Python 正则表达式 re
字符串匹配
[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
,其实就是两个字符串 ale
或 aple
。
最后一个复杂些就是 {m,n}
,这个表示前一个字符可重复次数是一个区间,也就是最少重复m次,最多重复n次。
例如 ap{2,3}le
将会匹配 apple
,appple
两个字符串,其他都不会匹配。
编译
对!你没看错,如果想使用正则表达式,首先得要把它编译成模式对象。编译成对象后,它就可以使用各种操作方法了,比如字串匹配查询或替换等。
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 | 忽略正则字符串中的空格,除非空格位于字符类中或前面带有未转义的反斜杠,可以组织和缩进,还可以写注释 |
实例:去掉字串中的中文
>>> import re
>>> p = re.compile(r'[\u4e00-\u9fa5]')
>>> en = re.sub(pattern, '', "I love 东南 SEU.")
>>> print(en)
I love SEU.
>>> print(en.replace(" "," "))
I love SEU.
>>>
查找匹配
其实上面说的编译都只是在做准备,准备接下来要介绍的,正则表达式最重要的查询匹配。
常用匹配方法:
-
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'>
摘抄混分......
相关文章
- 轻松自动化---selenium-webdriver(python) (一)
- Python基础(9)--正则表达式
- 将python图片转为二进制文本的实例
- 使用Python正则表达式RE从CSDN博客源代码中匹配出博客信息
- Python语言学习:Python语言学习之正则表达式相关(re正则表达式库)的简介、常用函数、案例应用之详细攻略
- Python之tushare:tushare库的简介、安装、使用方法之详细攻略
- Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
- Python每日一练——第30天:正则表达式练习
- pip:带你认识一个 Python 开发工作流程中的重要工具
- 【阶段三】Python机器学习29篇:机器学习项目实战:DBSCAN算法的基本原理与DBCSAN新闻聚类分群模型
- Python学习67:正则表达式
- Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法
- python里使用正则表达式的内嵌功能选项标志
- python里使用string.Template实现自定义转义字符和正则表达式替换
- python里使用正则表达式排除集合里字符的功能
- python里使用正则表达式的search()函数实现指定位置搜索
- python里使用正则表达式的选项参数
- python里使用正则表达式的DOTALL标志
- python里使用正则表达式的后向搜索肯定模式
- python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6
- python基础===正则表达式(转)
- Python爬虫之puppeteer搭建远程服务器
- 华为笔试题解析:1道题竟然包含12 种Python正则表达式用法,真是绝了!