您现在的位置是:网站首页 > 博客日记 >

Python正则re详解

作者:YXN-python 阅读量:71 发布日期:2024-05-15

1、正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自带了re模块,它提供了对正则表达式的支持。

  • 创建正则对象 reg = re.compile(str[,flag])
  • 使用正则函数 re.函数名(reg , string [,匹配模式])
  • re.match(pattern, string[, flags])  # 匹配字符串,返回一个Match对象
    re.search(pattern, string[, flags])  # 搜索字符串,返回一个Match对象
    re.split(pattern, string[, maxsplit])  # 将字符串按照模式分割,返回一个列表
    re.findall(pattern, string[, flags])  # 搜索字符串,返回一个匹配列表
    re.finditer(pattern, string[, flags])  # 搜索字符串,返回一个迭代器
    re.sub(pattern, repl, string[, count])  # 替换字符串中匹配的模式,返回替换后的字符串
    re.subn(pattern, repl, string[, count])  # 替换字符串中的内容,返回替换后的字符串和替换次数
    
    re.escape(pattern)	# 转义 pattern 中的特殊字符,不能用于 sub() 和 subn() 的替换字符串
    re.purge()	# 清除正则表达式的缓存。
  • 匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M。可选值有
  • re.I(全拼:IGNORECASE): 忽略大小写
    re.M(全拼:MULTILINE): 多行模式,改变'^'和'$'的行为
    re.S(全拼:DOTALL): 点任意匹配模式,改变'.'的行为,可以匹配 \n

更多详情参考-Python正则re匹配函数

import re
# 构建一个规则
变量 = re.compile( '规则str' ,匹配模式=None )
变量就是正则对象

1、普通字符串

abc   : 表示一个 abc
1234  : 表示一个 1234

2、 [  ]  匹配 1 个字符

[ ] 	   : 匹配 1 个字符, 减号- 表示范围
    
[abcxyz]   : 表示 abcxyz 中的一个
[123]      : 表示 1 或 2 或 3
[a-z]      : 表示 a-z 中的一个,即一个小写字母
[c-k]      : 表示 c-k 中的一个
[0-9]      : 表示 0-9 中的一个,即一个数字
[A-Z]      : 表示一个大写字母
a[1-4]     : 表示 a1 或 a2 或 a3 或 a4
[1-9][0-9] : 表示 10-99 ,一个两位数
[10-39]    : 表示 0 1 2 3 或 9
[1\-9]     : 表示 1 ,减号- ,或 9
[a-zA-Z0-9]: 表示 1 个 字母 或 数字
[\\/:*?"<>|] : 表示 \/:*?"<>| 中的一个,第一个反斜杠,转义用的,这些事windows 中不能作为文件名的符合
[\u4e00-\u9fa5]: 表示一个中文 

练习: 表示 a1 a2 a3...a9  b1 b2 ...b9 .c1..d1..h1.. z1 z2 ....z9
		[a-z][1-9]
	  表示一个 130~139  或者 150~159
		1[35][0-9]

3、元字符

就是有特殊含义的字符 ,比如上面的 减号,他在 [ ] 中 ,表示范围

下面是几个常用的特殊字符
.    : 表示任意一个单字符 或 一个中文。 默认情况下不表示换行 \n

下面是一个表示次数的字符
*    : 表示它前面的内容是 任意次数。 如 a* ,表示任意个连续的 a 。如0个a, a ,aa ,aaa ,aaaa ,...
+    : 表示它前面的内容是 1次以及以上。 如 b+ , 表示一个以上连续 的 b
?    : 表示它前面的内容是 0或1次。 如 c? , 表示 没有c 或 1个c 。即有1个或无
	
	如: a[1-9]?b   表示 ab  或 a1b  a2b ... a9b

^ 在[]中是取反的作用
[^abc]  :  表示不是一个 a或b或c
[^0-9]  :  表示不是一个数字

^ 开头的作用
^ :表示开头。 如 : ^abc  ,表示 abc 为开头
$ : 表示结尾。 如 : abc$  ,表示 abc 为结尾
	如: 
		^abc.*xyz$ : 表示某str以 abc 开头中间任意内容,xyz结尾
		abc.*xyz : 表示某str中有 'abc中间任意内容xyz'

4、转义字符

有特殊含义的字符,前面放\ ,代表这个字本身
\.  
\*
\?
\+
\\
\(
\-
...

转义字符 与 字母:
\d  : 表示一个 0-9 ,相当于[0-9]
\D  : 表示不是一个0-9,相当于[^0-9]
\w  : 小写w ,表示 一个字母、数字、下划线、中文
\W  : 大写w ,表示 不是一个字母、数字、下划线、中文
\s  : 小写s ,表示一个空格
\S  : 大写s ,表示不是 一个空格

5、量词

量词 ,修饰前面的内容的 数量
{}
a{n}   : 表示 n 个连续的 a ,如 a{3} 表示 aaa
b{m,n} : 表示 m-n个连续的 b ,如 b{2,4}  表示 bb 或 bbb 或 bbbb 
c{1,}  : 表示 一个以上连续的c,相当于 c+
d{0,}  : 表示 0个以上连续的d, 相当于 d*
e{0,1} : 表示0或1 个 e,相当于 e?
	如:
	ab{1,3}  表示	ab  abb  abbb
 	a{1,2}b{1,3}  表示 ab abb abbb  aab aabb aabbb

6、组

用括号实现(),常说的整体, 在( ) 中 竖线| 表示 或 
(张三|李四)  : 表示 张三 或 李四
(abc){2}    : 表示  abcabc
(ab){1,3}   : 表示 ab abab ababab
(138|152|18[2-4]) : 表示 138  152  182  183  184

练习: 
1、表示 一个 11 位数字的电话号码 ,138打头
	138\d{8}     138[0-9]{8}   138\d\d\d\d\d\d\d\d
2、表示 一个11位的电话号码,138开头,最前面的 +86 可有可无
	(\+86)?138\d{8}
3、表示 6-11数字组成qq邮箱, 0不能做开头
	xxx@qq.com
	[1-9]\d{5,10}@qq\.com

7、正则的方法

re.findall( pat , 字符串 )
将 字符串中 符合 pat 规则的内容。以list 的形式 返回
word = 'ab1c123 ab2c456 ab3c789 xb4c'
	
pat = re.compile('ab\d')

8、 贪婪模式和 非贪婪模式

a.*c  ,默认是贪婪的,找最长的 符合 axxxc 的结构
a.*?c , 非贪婪的,找到一个短结构就可以

9、查找模式与捕获模式

如果正在中存在 组( ) ,默认认为是  组:整体的概念
    如: pat = re.compile( 'a(\d+)c' )
但是 当把正则 放在 re.findall( pat , str ) 等函数中的时候,
	
捕获模式: 
    会匹配 str 中 符合 pat 结构的,但是不是 返回 a数字c 组成的list, 
    而是捕获 a数字c中间的数字返回。
查找模式:
    在括号内最前面加上 ?: ,就是查找模式
    如 pat = re.compile( 'a(?:\d+)c' )
    re.findall( pat , str ),返回 a数字c 组成的list

10、创建正则的技巧

  1. 把 统一结构复制下来,然后 去异存同。
  2. 把去掉的用 .\*?代替, 把你要 保存的用  (.\*?) 代替
  3. .\*? 与 (.\*?) 前后,必须有 原字符串 中 至少一个字符

小练习

# 抓取51job 首页的城市 名称
from mytools import get_res
url = 'https://www.51job.com/'
res = get_res(url)
reg = re.compile('<span><a href="//www.51job.com/.*?/">(.*?)</a></span>')
result = re.findall( reg , res.text )
print(result)

 

 

 

 

 

 

YXN-python

2024-05-15