【Python】正则re的使用
一、正则re
-
正则是什么
- 字符串匹配
- 从一堆字符串中查找符合条件的字符串
- 正则表达式:特殊的字符序列,检查一个字符串是否与某种模式匹配
- re 模块:拥有全部的正则表达式功能
-
正则表达式使用
- 常用的正则模式串编写 (pattern)
- 使用模式串进行匹配
- re.match(pattern, string, flags=0)
- pattern: 模式串
- string: 需要被查找的字符串
- flags: 正则表达式的匹配方式 (如:是否区分大小写,多行匹配等等)
- 如果匹配成功则返回匹配对象,否则返回None
- re.findall(pattern, string, flags=0)
- 在string中查找所有子串,返回一个列表;没有找到匹配,返回空列表
- match只查找一次,findall匹配所有
-
神一样的(.*?)
- .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
- (.*?) 表示"非贪婪"模式,只保存第一个匹配到的子串
-
可选标志(flags)
可选标志修饰符用于控制匹配的模式。多个标志可以通过按位 OR(|) 它们来指定。(如 re.I | re.M 被设置成 I 和 M 标志)
修饰符 描述 re.I 使匹配对大小写不敏感 re.L 做本地化识别(locale-aware)匹配 re.M 多行匹配,影响 ^ 和 $ re.S 使 . 匹配包括换行在内的所有字符 re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 -
常用正则模式符
-
案例: 字符串
s = '''abcd-摩托车.blend\n-----1234-大象.blend\n----efg-卡车.blend\n----5678-蘑菇.blend\n---'''
import re
# - 只提取前面有数字的 blender文件信息
pattern = r"[0-9]+.+\.blend"
pattern = r"-([0-9]+.*?)\n"
res = re.findall(pattern=pattern, string=s)
print(res)
常用的正则模式串编写 (pattern)
- 单字符:
- “.” 匹配一个任意字符
- [] 匹配中括号内的一个字符
- “\d” 匹配数字0-9中的一个 digital
- “\D” 匹配非数字的任意一个字符
- “\s” 匹配一个空白符 如 空格、制表符 space
- “\S” 匹配非空白符的任意一个字符
- “\w” 匹配字母+数字,即a-z+A-Z+0-9中 的一个 word
- “\W” 匹配非字母非数字的任意一个字符
- 数量符:
- “*” 前一个字符出现次数任意
- “+” 前一个字符出现次数 ≥ 1
- “?” 前一个字符出现次数 ≤ 1
- {m} 前一个字符出现次数 = m
- {m,} 前一个字符出现次数 ≥ m
- {m,n} m ≤ 前一个字符出现次数 ≤ n
- 边界符:
- ^ 开始标记
- & 结束标记
- \b 单词 边界
- \B 非单词 边界
import re
email1 = "karrycharon@qq.com"
email2 = "karrycharon@163.net"
email3 = "邮箱--karrycharon@163.com"
email4 = "karrycharon@qqcom"
# .net结尾 中文开头 没有@ 没有.
pattern = r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$'
res = re.findall(pattern=pattern, string=email1)
print("emil1:", res)
res = re.findall(pattern=pattern, string=email2)
print("emil2:", res)
res = re.findall(pattern=pattern, string=email3)
print("emil3:", res)
res = re.findall(pattern=pattern, string=email4)
print("emil4:", res)