一, 正则式表达式语法
正则表达式是一种用来匹配字符串的强有力的武器, 设计思想是一种描述性的语言来给字符串定义一个规则, 烦死符合规则的字符串, 就认为它匹配, 否则不匹配
行定位符: 用来描述字符串的边界
^: 表示行的开始 $: 表示行的结尾
- eg:^tm #表示要匹配字符串 tm 的开始位置是行头
- tm^ #表示要匹配字符串 tm 的开始位置是行尾
- tm: #表示要匹配字符串 tm 的开始位置是任意位置
元字符: 指在正则表达式中具有特殊意义的专用字符(如:^,$)
. : 匹配除换行以外的任意字符 \w: 匹配字母或数字或下划线或汉字
\s: 匹配任意的空白符 \d: 匹配数字
\b: 匹配单词的开始或结束 ^: 匹配任意字符串的开始
$: 匹配字符串的结束
限定符(重复): 限制匹配数量
eg:^\d{8}$ #匹配 8 位数的 QQ 号
?: 匹配前面的字符零次或一次 colou?r #可匹配 color 或 colour
+: 匹配前面的字符一次或多次 go+gle #可匹配 gogle 到 goo...gle
*: 匹配前面的字符零次或多次 go*gle #可匹配 ggle 到 goo...gle
{n}: 匹配前面的字符 n 次 go{2}gle #可匹配 google
{n,}: 匹配前面字符最少 n 次 go{2,}gle #可匹配 google 到 goo...gle
{n,m}: 匹配前面字符最少 n 次最多 m 次 go{0,2}gle #可匹配 ggle,gogle,google
字符类: 定义一个字符集合, 匹配集合中的字符, 使用 [] 表示(主要针对没有预定义元字符集合)
- [0-9] #等同于 \ d, 匹配数字 [a-z0-9A-Z] #(只考虑英文时)等同于 \ w
- [aeiuo] #匹配英文元音字母 [.?!] #匹配标点符号 ".""?""!"
排除字符: 匹配不符合指定字符集合的字符串 (用 ^ 表示, 但在[] 中使用)
[^a-zA-Z] #不是字母的集合
选择字符: 用来表示匹配一个集合或另一个集合(用 | 表示)
- [a-z]|[0-9] #匹配 a-z 或 0-9 的字符
- (^\d{
- 15
- }$)|(^\d{
- 18
- }$)|(^\d{
- 17
- })(\d|X|x)$
- # 表示 15 位纯数字或 18 位纯数字或者前 17 位纯数字最后一位位为 X 或 x
转义字符: 使用 \ 表示, 把一个特殊字符转义成普通字符,"()" 在正则表达式中也算是一个元字符
分组 (子表达式): 使用() 表示
()可以改变限定字符的作用范围
(thir|four)th #表示可以匹配 thirth 或 fourth
()可以分组
(\.[0-9]{1,3}){3} #就是对分组 (\.[0-9]{1,3}) 进行重复三次操作
正则表达式语法:
使用正则表达式时, 时将其作为模式字符串使用的(模式字符串中的 \ 等符号需要转义)
- '[a-zA-Z]' #匹配不是字母的字符
- '\\bm\\w*\\b' #匹配以 m 开头的单词(其中一个 \ 为转义字符)
模式字符串中含有大量特殊字符串时, 可以使用原生字符串表示(在模式字符串前加 R 或 r)
r'\bm\w*\b' #等同于'\\bm\\w*\\b'的效果, 匹配以 m 开头的单词
在编写模式字符串时, 并不是所有的反斜杠都需要转换,^\d{8}$ 就不需要, 因为 \ d 没有特殊意义, 为了书写方便, 一般使用原生字符串表示
二, 使用 re 模块实现正则表达式操作
re 模块的 compile()方法将模式字符串转换成正则表达式对象, 然后再使用该正则表达式对象的相关方法来操作字符串, 使用 re 模块时, 需要先用 import 导入(import re)
匹配字符串: 使用 re 模块提供的 match(),search()和 findall()方法
使用 match()方法匹配: 用于从字符串的开始处进行匹配(起始位置匹配成功, 则显示 match 对象, 否则显示 None)
re.match(pattern,string,[flags])
pattern: 表示模式字符串, 由要匹配的正则表达式转换而来
string: 表示要匹配的字符串
flags: 可选参数, 表示标志位, 用于控制匹配方式(如是否区分大小写)
常用标志位
A 或 ASCII: 对于 \ w,\W,\b,\B,\D,\d,\s,\S 只进行 ASCII 匹配(仅 Python3 中)
I 或 IGNORECASE: 执行不区分字母大小写的匹配
M 或 MULTILINE: 将 ^ 或 $ 用于包括整个字符串的开始和结尾的每一行(默认仅适用于整个字符串的开始处和结尾处)
S 或 DOTALL: 使用 "." 字符匹配所有字符, 包括换行符
X 或 VERBOSE: 忽略模式字符串中未转义的空格和注释
- eg:import re
- a = r'mr_\w+'
- b = 'MR_SHOP mr_shop'
- c = re.match(a,b,re.I)
- print(c,"\n")
- d = '项目名称 MR_SHOP mr_shop'
- c = re.match(a,d,re.I)
- print(c)
匹配以 mr_开头, 不区分字母大小写的字符串
使用 search()方法匹配: 在整个字符串中搜索第一个匹配的值, 如起始位置匹配成功, 则显示 match 对象, 否则显示 None
- re.search(pattern,string,[flags])
- eg:a = r'mr_\w+'
- b = 'MR_SHOP mr_shop'
- c = re.search(a,b,re.I)
- print(c,"\n")
- d = '项目名称 MR_SHOP mr_shop'
- c = re.search(a,d,re.I)
- print(c)
使用 findall()方法匹配: 在整个字符串中搜索所有复核正则表达式的字符串, 并以列表形式返回, 匹配成功者返回包含匹配结构的列表, 否则返回空列表
- re.findall(pattern,string,[flags])
- eg:import re
- a = r'mr_\w+
- b = 'MR_SHOP mr_shop'
- c = re.findall(a,b)
- print(c,"\n")
- d = '项目名称 MR_SHOP mr_shop'
- c = re.findall(a,d,re.I)
- print(c)
注: 在指定的模式字符串中包含分组时, 则返回与分组匹配的文本列表 (要想获取整个模式字符串的匹配, 可以将整个模式字符串用() 进行分组, 然后再获取结果时, 只取返回值列表的每个元素 (返回元组) 的第一个元素
- eg:import re
- a = r'[1-9]{1,3}(\.[0-9]{1,3}){3}'
- b = '127.0.0.1 192.168.1.66'
- c = re.findall(a,b)
- print(c)
- eg:import re
- a = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'
- b = '127.0.0.1 192.168.1.66'
- c = re.findall(a,b)
- for d in c:
- print(d[0])
替换字符串: sub()方法
re.sub(pattern,repl,string,count,flags)
pattern: 表示模式字符串
repl: 表示替换的字符串
string: 表示要被查找替换的原始字符串
count: 可选参数, 表示模式匹配后替换的最大次数, 默认为 0, 表示替换所有的匹配
flags: 可选参数, 表示标志位, 用于控制匹配方式
- eg:import re
- a = r'1[34578]\d{9}' #定义 11 位手机号码的模式字符串
- b = '中奖号码为: 84978981, 联系电话为 13611111111'
- print(re.sub(a,'1XXXXXXXXXXX',b))
使用正则表达式分割字符串: 根据正则表达式分割字符, 并以列表形式返回; split()方法
re.split((pattern,string,[maxsplit],[flags]))
pattern: 模式字符串, 有要匹配的正则表达式转换而来
string: 要匹配的字符
maxslip: 可选参数, 表示最大的拆分次数
flags: 可选参数, 表示标志位
- eg:import re
- a = r'[?|&]'
- url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv'
- print(re.split(a,url))
来源: https://www.cnblogs.com/dameon/p/10784488.html