正则表达式
正则表达式是什么? 我认为正则表达式是一种根据特定语法构造的文字匹配表达式
正则表达式语法
正则表达式的发明是为了匹配 文字, 当然 文字 是一个很抽象的概念. 下面我们来 具象它.
现在我们对计算机中所有的文字进行分类:
- 英文字母 (a…z, A…Z)
- 数字 (0…9)
- 空格和Tab键 (Space 和 Tab)
- 其他字符 (汉字, 法语字母, 日语字母…)
例如:
上面是使用正则表达式匹配单个文字的例子, 为了一次性匹配多个文字, 正则表达式
规定了一些其他的语法, 这些语法需要勤加练习才能掌握, 这里就不再赘述了.
具体语法我写在下面了
\w: 英文(26), 数字, 中文...
\W: 非英文, 数字, 中文...
[]: 匹配 "中括号" 中表达式的其中一种情况
\s: 匹配空格和tab键
\t: 匹配空格和tab键
\d: 只匹配一个数字
. : 任意字符, 但是\n匹配不了1
^: 从开头匹配, 不会因为中间符合条件就成功
$: 一直匹配到结尾
* : 匹配0次或者无限次, 接在匹配一个的后面
{n, m} : 匹配n-m个, 接在匹配一个的后面
? : 匹配0个或者一个, 接在匹配一个的后面
re.match(re, striing, re.S).group()
能够匹配到\n,
+ : 只能匹配1个或无限个, 和*号区别
\ : 转义, 在. 或者 ? 前添加
| : python中匹配前面一段或者后面一段东西,
一般需要借助括号来限定其作用域
学习正则表达式, 推荐上正则表达式在线练习网站
python 中的正则表达式
re 菜鸟教程
在编写 python 代码来使用正则表达式匹配文字时, 我们需要借助re库. 下面通过一些例子来介绍它的使用.
- 使用正则表达式匹配并提取字符串中的 ip 地址
import re
template_str = ';lajfa;fj;ajfljd127.0.0.1aljf;lajflkjafkldjalkfjd192.169.3.3'
re_str = r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}' # 定义正则表达式
ip_pattern = re.compile(re_str) # 编译正则表达式, 套路
ips = re.findall(ip_pattern, template_str) # 找出所有的符合正则表达式的 文字
print('ips: ', ips) # 返回一个结果 list
"""ips: , ['127.0.0.1', '192.169.3.3']"""
- 使用正则表达式匹配并提取字符串中的电话号码
import re
template_str = '13600000000博主真帅809890889089'
re_str = r'[1]([3-9])[0-9]{9}' # 定义正则表达式
iphone_pattern = re.compile(re_str) # 编译正则表达式, 套路
iphones = re.match(iphone_pattern , template_str).group(0)
# 找出 1 个 匹配正则表达式的字符串
print('iphons: ', iphones ) # 返回一个结果 list
"""iphons: 13600000000"""
- 使用正则表达式匹配并提取"博主"及其后面两个字符
import re
template_str = '13600000000博主真帅809890889089博主厉害'
re_str = r'博主.{2}' # 定义正则表达式
pattern = re.compile(re_str) # 编译正则表达式, 套路
result = re.search(pattern , template_str).group()
# 找出 1 个 匹配正则表达式的字符串
print('result: ', result ) # 返回一个结果 list
"""result: 博主真帅"""
总结 re 使用套路
套路1:
- 编写正则表达式
r'[1]([3-9])[0-9]{9}'
- 编译
re.compile(r'[1]([3-9])[0-9]{9}')
- 使用 match / search 匹配待提取字符串
re.match(paaatern, template_str, re.I)
- 使用group / groups 提取出匹配得到的字符串
group(0) / groups()
套路2:
6. 编写正则表达式
7. 编译
8. 使用 findall 匹配待提取字符串, 得到匹配结果 list
附录:
re的常用方法
1.re.match(pattern, str, flags=0)
从第一个字符开始匹配, 其中 pattern 对应前文的 pattern, str表示待匹配字符串, flags代表匹配模式
- re.search() # 同上
- re.findall() # 同上
- re.compile() # 编译
- re.sub(pattern, replace_str, str, count, flag ) # 字符串替换
- re.split(pattern, str, maxsplit, flags) # 字符串分割
re匹配模式
- re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和 # 后面的注释