Python3学习之路~5.13 re模块 正则表达式
re模块用于对python的正则表达式的操作。
常用正则表达式符号
字符数字: . 匹配除换行符以外的任意字符,即[^\n]
\s 匹配任意空白符(如\t、\n、\r )
\S 匹配任意非空白符
\w 匹配[A-Za-z0-9下划线汉字]
\W 匹配非[A-Za-z0-9下划线汉字]
\b 匹配单词的开始或结束
^或\A 匹配字符串的开始
$或\Z 匹配字符串的结束
\d或[0-9] 匹配所有数字
\D 匹配非数字 次数: * 重复零次或多次
+ 重复一次或多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次 其他:
| 匹配|左或|右的字符
(...) 分组匹配
\ 转义字符
[] 匹配符合[]内的字符
[^] 匹配不符合[]内的字符
组合:
(?P<name>...) 分组匹配
[a-z] 匹配所有小写字母字符
[^a-z] 匹配所有非小写字母字符
[^0-9] 匹配所有非数字字符
[\u4e00-\u9fa5] 匹配中文
(.*)或(.+) 匹配单行
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$ 匹配IP
^1[3|4|5|7|8|9][0-9]\d{8}$ 匹配手机号(貌似手机号第二位有3,4,5,7,8,9)
正则表达式代码实例
import re # . 匹配除换行符以外的任意字符,即[^\n]
# + 重复一次或更多次
# .+匹配任意字符串
res = re.search('f.+n',"abcd1234efghijklmn5678")
print(res.group()) # fghijklmn # \s 匹配任意空白符(如\t、\n、\r )
res = re.search('\s+',"123$+ \r\n b")
print(res.group()) # ' \r\n\t' # \S 匹配任意非空白符
res = re.search('\S+',"123aZ你好$+ \r\n b")
print(res.group()) # 123aZ你好$+ # \w 匹配[A-Za-z0-9下划线汉字]
res = re.search('\w+',"123_你好$+ b")
print(res.group()) # 123_你好 # \W 匹配非[A-Za-z0-9下划线汉字]
res = re.search('\W+',"123_你好$+ b")
print(res.group()) # $+ # ^或\A 匹配字符串的开始
# $或\Z 匹配字符串的结束
res = re.search('\A[0-9]+[a-z]\Z',"123b")
print(res.group()) # 123b res = re.search('^[0-9]+[a-z]$',"123b")
print(res.group()) # 123b # \d或[0-9] 匹配所有数字
res = re.search('abcd\d',"abcd1234efgh5678")
print(res.group()) # abcd1 res = re.search('abcd[0-9]',"abcd1234efgh5678")
print(res.group()) # abcd1 # \D 匹配非数字
res = re.search('\D+',"123$+ b")
print(res.group()) # $+ b # ? 重复零次或一次
res = re.search('aal?',"aalex") # 匹配aa或者aal
print(res.group()) # aal res = re.search('aal?',"aaex")
print(res.group()) # aa # * 重复零次或多次
# {n} 重复n次
# {n,} 重复n次或更多次
# {n,m} 重复n到m次
res = re.search('e[0-9]*',"aa1e2345x")
print(res.group()) # e2345 res = re.search('[0-9]{3}',"aa1e2345x")
print(res.group()) # res = re.search('[0-9]{3,}',"aa1e2345x")
print(res.group()) # res = re.search('[0-9]{1,3}',"aa1e2345x")
print(res.group()) # # | 匹配|左或|右的字符
res = re.search('abc|ABC',"ABCdabcD")
print(res.group()) # ABC # (...) 分组匹配
res = re.search('abc{2}',"Alexabcc") #匹配c两次
print(res.group()) # abcc res = re.search('(abc){2}',"Alexabcabc") #匹配abc两次
print(res.group()) # abcabc # \ 转义字符
res = re.search(r"\\","abcd12s3\df4sa5f")
print(res.group()) # \ res = re.search("\\\\","abcd12s3\\df4sa5f")
print(res.group()) # \ res = re.search('(abc){2}\|',"Alexabcabc|") #匹配管道符,前面需加反斜杠转义
print(res.group()) # abcabc| res = re.search('(abc){2}(\|\|=){2}',"Alexabcabc||=||=") #等号不需转义
print(res.group()) # abcabc||=||= # (?P < name >...) 分组匹配
res = re.search("(?P<id>[0-9]+)","abcd1234sdfsaf")
print(res.groupdict()) # {'id': '1234'} res = re.search("(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)","abcd1234sdfs#2af")
print(res.groupdict()) # {'id': '1234', 'name': 'sdfs'}
a=res.groupdict()
print(a['id']) #
a =res.group('id')
print(a) # res = re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{8})","")
print(res.groupdict()) # {'province': '3711', 'city': '02', 'birthday': '19921118'} # [a-z] 匹配所有小写字母字符
res = re.search('[a-z]+',"ABCD1234abcd&*")
print(res.group()) # abcd # [^a-z] 匹配所有非小写字母字符
res = re.search('[^a-z]+',"ABCD1234abcd&*")
print(res.group()) # ABCD1234 # [^0-9] 匹配所有非数字字符
res = re.search('[^0-9]+',"ABCDabcd&*1234")
print(res.group()) # ABCDabcd&* # [\u4e00-\u9fa5] 匹配中文
res = re.search('[\u4e00-\u9fa5]+',"ABCDabcd&*1234你好")
print(res.group()) # 你好 # (.*)或(.+) 匹配单行
res = re.search('(.*)',"ABCDabc\nd&*1\r\n234你好")
print(res.group()) # ABCDabc res = re.search('(.+)',"ABCDabc\nd&*1\r\n234你好")
print(res.group()) # ABCDabc # ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$ 匹配IP
res = re.search('^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$',"192.168.1.10")
if res:
print(res.group()) # 192.168.1.10
else:
print('it is not a valid IP') # ^1[3|4|5|8][0-9]\d{8}$ 匹配手机号
res = re.search('^1[3|4|5|7|8|9][0-9]\d{8}$',"")
if res:
print(res.group()) #
else:
print('it is not a valid phone number')
re模块中最常用的匹配语法
1、match(pattern, string, flags=0) 从起始位置开始根据模型去字符串中匹配指定内容,匹配单个
- 正则表达式
- 要匹配的字符串
- 标志位,用于控制正则表达式的匹配方式
import re
res = re.match('\d+', '123uuasf')
if res:
print(res.group()) #
2、search(pattern, string, flags=0) 根据模型去字符串中匹配指定内容,匹配单个
import re
res = re.search('\d+', 'aa123uuasf')
if res:
print(res.group()) #
3、findall(pattern, string, flags=0) 根据模型去字符串中匹配指定内容,匹配所有。注意:findall没有group方法。
import re
res = re.findall('\d+', 'fa123uu888asf')
if res:
print(res) # ['123', '888']
4、sub(pattern, repl, string, count=0, flags=0) 用于替换匹配的字符串,相比于str.replace功能更加强大
import re
res = re.sub("[0-9]+","|","abcd12s3df4sa5f")
print(res) # abcd|s|df|sa|f
res = re.sub("[0-9]+","|","abcd12s3df4sa5f",count=2)
print(res) # abcd|s|df4sa5f
5、split(pattern, string, maxsplit=0, flags=0) 根据指定匹配进行分组,相比于str.split更加强大
import re
res = re.split("[0-9]+","abcd12s3df4sa5f")
print(res) # ['abcd', 's', 'df', 'sa', 'f']
6、group和groups
import re
a = "123abc456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group()) # 123abc456 print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0)) # 123abc456
print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1)) #
print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2)) # abc print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()) # ('123', 'abc', '456')
几个匹配模式
# flags
I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # 忽略大小写
M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # 多行模式,可改变'^'和'$'的行为
S = DOTALL = sre_compile.SRE_FLAG_DOTALL # 点任意匹配模式,可改变'.'的行为
L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale
U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale
X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
import re # I = IGNORECASE 忽略大小写
res = re.search("[a-z]+","abcdA123",flags=re.I)
print(res.group()) # abcdA # M = MULTILINE 多行模式,可改变'^'和'$'的行为
res = re.search("^[a-z]+","\nabcd12\nA123",flags=re.M)
print(res.group()) # abcd 若不加flags=re.M则abcd是匹配不出来的 res = re.search("foo$","\nbfoo\nsdfsf",flags=re.M)
print(res.group()) # foo 不加flags=re.M则foo是匹配不出来的 # S = DOTALL 点任意匹配模式,可改变'.'的行为
msg = '''abc
123
'''
res = re.search("^.+",msg,flags=re.S)
print(res.group()) #由于msg中abc和123占2行,如果不加flags=re.S则只能匹配一行abc
# 输出:
# abc
#
匹配模式举例
反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
Python3学习之路~5.13 re模块 正则表达式的更多相关文章
- Python3学习之路~9.1 paramiko模块:实现ssh执行命令以及传输文件
我们一般使用linux的时候,都是在Windows上安装一个ssh客户端连接上去.那么从一台linux如何连接到另一条linux呢?使用ssh命令即可,因为每台linux机器自己都有一个ssh客户端. ...
- Python3学习之路~5.5 sys模块
用于提供对解释器相关的操作 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序 ...
- Python3学习之路~5.3 random模块
random模块常用方法: import random # 随机数 print(random.random()) # 生成一个0到1的随机浮点数,0 <= n < 1.0 print(ra ...
- Python3学习之路~5.11 configparser模块
用于生成和修改常见配置文档,当前模块的名称在 python 2.x 版本中为 ConfigParser, python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式 ...
- Python3学习之路~5.10 PyYAML模块
Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation
- Python3学习之路~5.8 shelve模块
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式 import shelve import datetime name = [& ...
- Python3学习之路~5.4 os模块
用于提供系统级别的操作 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shel ...
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- python学习之路(13)
列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...
随机推荐
- csproj文件中copy指令的使用方式
实际开发中有很多项目需要引用第三方的dll或者资源文件,且文件比较多,在运行时这些文件需要被拷贝到BIN目录. 使用VS自带的"复制到输出目录",似然方便,但是比较不零活,经过多次 ...
- (7) MySQL数据库备份详解
对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据可能也已经被删除了, 我们不能使 ...
- 【转】使用minizip解压缩多个文件(基于zlib)
原帖子:使用minizip解压缩多个文件(基于zlib) 写作目的:之前在网上看到很多人在寻找可以解压缩多个文件的程序,其中有尝试zlib的,使用zlib的源码可以生成后缀为点gz的压缩文件,但是一次 ...
- golang:iconv
最近在做邮件解析的工作,遇到需要转字符集编码的情况,go官方好像没有提供这样的库,于是从github上找了一下. https://github.com/qiniu/iconv 开发环境: linux ...
- [python] ThreadPoolExecutor线程池 python 线程池
初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...
- C语言 goto语句
/* goto语句 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* goto语句也 ...
- 接口和多态都为JAVA技术的核心。
类必须实现接口中的方法,否则其为一抽象类. 实现中接口和类相同. 接口中可不写public,但在子类中实现接口的过程中public不可省. (如果剩去public则在编译的时候提示出错:对象无法从 ...
- Shell常见问题整理
1. 使用shell进行程序设计的原因是什么? 可以快速.简单的完成编程,非常适合于编写一些执行相对简单的任务的小工具.如果有一个简单的构想,可以通过它检查自己的想法是否可行.还可以使用shell对进 ...
- windows pm2 启动nodejs失败:Error: EBADF: bad file descriptor, uv_pipe_open
windows下打开命令窗口,安装pm2:npm install pm2 -g pm2成功安装,在项目目录下用pm2启动服务:pm2 start index.js,结果启动失败,错误如下: .pm2\ ...
- 提高MySQL数据库的安全性
1. 更改默认端口(默认3306) 可以从一定程度上防止端口扫描工具的扫描 2. 删除掉test数据库 drop database test; 3. 密码改的复杂些 # 1 set password ...