本文写作思路和建议: 1、本文主要阐述了Python正则表达式的概念、常用操作、使用方法,方便快速了解正则表达式的应用; 2、学习之前建议对字符串进行深入的了解,比如字符串的常用操作等,因为正则表达式一般主要操作对象就是对于字符串的处理; 3、为了方便查看结果,文章开始就使用了python的re模块中match()方法,在文中后边会详细说明这个方法的使用技巧,前边使用只是为了输出我们需要的结果信息。
1 正则表达式的定义
- 正则表达式一般操作对象为字符串;
- 通常的可以理解为正则表达式为记录文本规则的代码或工具;
- 应用场景为比如查找符合某些复杂规则的字符串。
以下是关于正则的一些基本使用和操作。
2 行定位符
- 行定位符用来描述子串的边界;
- 主要使用“ ^ ”表示行开始,使用" $ "为行结尾;
- 比如针对以下字符串的造作,我们匹配行开始(注意这里的re模块的使用后续会详细说明,这里先用一下):
import re
str_01 = "python is my favourite programing language!"
str_02 = "who is my favourite programing language of python! "
pat = r"^python"
str_result_01 = re.match(pat, str_01, re.I)
str_result_02 = re.match(pat, str_02, re.I)
print(str_result_01.string) # 输出为:python is my favourite programing language!
print(str_result_02) # 没有匹配到,输出为:None
3 元字符
- 除了前边的“^”和"$"外,正则表达式还有很多元字符;
- 比如格式:bqww*b;
- 上边的这个格式应该如何理解呢:
① 这个格式表示用于匹配以字母qw开头的单词; ② 先从某个单词开始处(b),然后匹配字母qw,接着是任意的字母或字符(w*),最后是单词结束处(b);
- 针对上边这个格式,我们简单看一个示例,我们的匹配需求如下:
如匹配格式: bqww*b,那么下边的都可以匹配qw123213和qwerererer; 不能匹配123qw和werqw。
- 代码如下:
import re
pat_01 = r"bqww*b"
str_list = ["qw123213", "qwerererer", "123qw", "werqw"]
for i in range(4):
str_result = re.match(pat_01, str_list[i], re.I)
print(str_result)
# 输出为:
# <re.Match object; span=(0, 8), match='qw123213'>
# <re.Match object; span=(0, 10), match='qwerererer'>
# None
# None
- 以下是常用的元字符:
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
w | 匹配字母、数字、下划线或汉字 |
W | 匹配除字母、数字、下划线或汉字以外的字符 |
s | 匹配单个空白符(包括tab键和换行符) |
S | 匹配除单个空白符(包括tab键和换行符)以外的所有字符 |
d | 匹配数字 |
b | 匹配单词的开始或结束,单词的分界符通常是空格、标点符号或者换行 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
4 限定符
- 限定符就是指定数量的字符;
- 之前提到的可以匹配任意字符的元字符,那如果要匹配特定数量的数字,就要使用限定符了;
- 以下是常用限定符:
限定符 | 说明 |
---|---|
? | 匹配前边的字符零次或一次 |
| 匹配前边的字符一次或多次 |
* | 匹配前边的字符零次或多次 |
{n} | 匹配前边的字符n次 |
{n,} | 匹配前边的字符最少n次 |
{n,m} | 匹配前边的字符最少n次,最多m次 |
- 关于限定符我们来看以下示例:
我们的需求是列表中有几组字符串,遍历列表后,把是6位数字的进行匹配,打印看结果是否能匹配到。
- 详细代买如下:
import re
pat_02 = r"^d{6}$"
str_list = ["123456", "12345678", "123456789", "345678"]
for i in range(4):
str_result = re.match(pat_02, str_list[i], re.I)
print(str_result)
# 输出为:
# <re.Match object; span=(0, 6), match='123456'>
# None
# None
# <re.Match object; span=(0, 6), match='345678'>
5 字符类
正则表达式可以匹配数字和字母,因为这些有对应的元字符;
但是如果没有元字符的字符如何匹配呢?
以下是列举了一些没有元字符的字符匹配方式,方法就是直接在方括号中括起来即可:
【aeiou】,匹配任何一个英文元音字母 【.?!】,匹配标点符号(" . " 或" ? "或" ! ") 【0-9】,和"d"一样,0-9任意一个数字 【a-z0-9A-Z】,等同于"w"
- 关于上边提到的我们看个示例:
import re
pat_03 = r"[a]"
str_list = ["aeiou1233", "23aeiou34", "a2e3i44o56u"]
for i in range(3):
str_result = re.match(pat_03, str_list[i], re.I)
print(str_result)
# 输出为:
# <re.Match object; span=(0, 1), match='a'>
# None
# <re.Match object; span=(0, 1), match='a'>
6 排除字符
- " ^ "表示行的开始,如果放在方括号中表示排除;
- 如【^a-zA-Z】表示匹配一个不是字母的字符(请注意这里的方括号是英文的法,因为打不出来,所以用中文代替);
- 示例如下:
import re
pat_04 = r"[^a-zA-Z]"
str_list = ["abcdfg234324", "12354454", "a2e3i44o56u"]
for i in range(3):
str_result = re.match(pat_04, str_list[i], re.I)
print(str_result)
# 输出为:
# None
# <re.Match object; span=(0, 1), match='1'>
# None
7 选择字符
- 使用" | "来表示,意思为"或"
- 比如我们用这个符号来匹配手机号(11位)或座机号(11位);
import re
pat_05 = r"(^d{11}$)|(^d{8}$)"
str_list = ["13312344321", "02912341234", "1879245"]
for i in range(3):
str_result = re.match(pat_05, str_list[i], re.I)
print(str_result)
# 输出为:
# <re.Match object; span=(0, 11), match='13312344321'>
# <re.Match object; span=(0, 11), match='02912341234'>
# None
8 转义字符
- 转移字符就是将特殊字符变成普通字符;
- 转移字符使用()表示;
- 比如我们匹配ip地址:
import re
pat_06 = r"[0-9]{1,3}.[0-9]{1,2}.[0-9]{1,3}.[0-9]{1,3}"
str_list = ["127.0.0.1", "172.1.1.1", "192.168.2.1"]
for i in range(3):
str_result = re.match(pat_06, str_list[i], re.I)
print(str_result)
# 输出为:
# <re.Match object; span=(0, 9), match='127.0.0.1'>
# <re.Match object; span=(0, 9), match='172.1.1.1'>
# None
9 分组
- 分组我们可以使用小括号;
- 比如:
(ma|pa)th,匹配math和path
10 re模块实现正则表达式详解
- 使用以下引入re模块即可:
import re
10.1 匹配字符串
10.1.1 match()方法
- 从字符串的开始处进行匹配,匹配成功返回Match对象,失败返回None;
- 语法:
re.match(pattern,s,flags)
- 说明:
pattern:模式字符串 s:要匹配的字符串 flags:可选,控制匹配方式
- 一个示例:
# -*- coding:utf-8 -*-
import re
pattern = r"httpw "
s = "HTTPS://cloud.tencent.com/developer/user/10298071"
s1 = "博客地址HTTPS://cloud.tencent.com/developer/user/10298071"
mymatch = re.match(pattern, s, re.I)
mymatch1 = re.match(pattern, s1, re.I)
print(mymatch)
print(mymatch1)
# 输出为:
# HTTPS://cloud.tencent.com/developer/user/10298071
# None
- 关于flags常用标志
标志 | 说明 |
---|---|
A或ASCII | 只进行ASCII 匹配 |
I或IGNORECASE | 匹配不区分大小写 |
M或MULTILINE | 将^和$用于包括整个字符串的开始和结尾的每一行 |
S或DOTALL | 使用(.)字符匹配所有字符 |
X或VERBOSE | 忽略模式字符串中未转义的空格和注释 |
10.1.2 search()方法
- 用于在整个字符串中搜索第一个匹配的值,成功返回对象,失败返回None;
- 语法:
re.search(pattern,s,flags)
- 说明:
pattern:模式字符串 s:要匹配的字符串 flags:可选,控制匹配方式
- 一个示例:
import re
pattern = r"httpw "
s = "HTTPS://cloud.tencent.com/developer/user/10298071"
s1 = "博客地址HTTPS://cloud.tencent.com/developer/user/10298071"
mymatch = re.search(pattern, s, re.I)
mymatch1 = re.search(pattern, s1, re.I)
print(mymatch)
print(mymatch1)
# 输出为:
# <re.Match object; span=(0, 5), match='HTTPS'>
# <re.Match object; span=(4, 9), match='HTTPS'>
10.1.3 findall()方法
- 用于在整个字符串中搜索所有符合正则表达式的字符串,成功返回包含匹配结构的列表,失败返回空列表;
- 语法:
re.findall(pattern,s,flags)
- 说明:
pattern:模式字符串 s:要匹配的字符串 flags:可选,控制匹配方式
- 一个示例:
# -*- coding:utf-8 -*-
import re
pattern = r"httpw "
s = "HTTPS://cloud.tencent.com/developer/user/10298071"
s1 = "博客地址HTTPS://cloud.tencent.com/developer/user/10298071"
mymatch = re.findall(pattern, s, re.I)
mymatch1 = re.findall(pattern, s1, re.I)
print(mymatch)
print(mymatch1)
# 输出为:
# ['HTTPS']
# ['HTTPS']
10.2 替换字符串
- sub()方法用于字符串替换;
- 语法:
re.sub(patern, repl, s, count, flags)
- 说明:
代码语言:python代码运行次数:0复制patern:模式字符串 repl:替换的字符串 s:原始字符串 count:可选,替换的最大次数,默认为0 flags:控制匹配方式
import re
pattern = r"8[345]d{6}"
s = "文章中编号为:83578910"
result = re.sub(pattern, "98765432", s)
print(result) # 输出为:文章中编号为:98765432
10.3 正则表达式分割字符串
- 语法:
re.spilt(pattern, s, maxsplit, flags)
- 说明:
代码语言:python代码运行次数:0复制pattern:模式字符串 s:要匹配的字符串 maxsplit:可选,最大的拆分次数 flags:可选,控制匹配方式
import re
pattern = r"[?|&]"
s = "http://www.wertyy.com/login.jsp?username='admin'&password='123456'"
result = re.split(pattern, s)
print("原字符串:", s)
print("分割后的字符串:", result)
# 输出为:
# 原字符串: http://www.wertyy.com/login.jsp?username='admin'&password='123456'
# 分割后的字符串: ['http://www.wertyy.com/login.jsp', "username='admin'", "password='123456'"]
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!