文章目录
- 正则表达式匹配原则:
- 一、匹配字符:
- 二、匹配位置
- 三、匹配重复
- 四、其他
- 五、正则表达式分组
- re模塊常量
- re模塊函數
- 注意事項
正则表达式匹配原则:
1.正确性,能够正确的匹配出目标字符串.
2.排他性,除了目标字符串之外尽可能少的匹配其他内容.
3.全面性,尽可能考虑到目标字符串的所有情况,不遗漏.
一、匹配字符:
- 普通字符
匹配规则:每个普通字符匹配其对应的字符
In : re.findall(‘ab’,“abcdefabcd”)
Out: [‘ab’, ‘ab’] - 匹配单个字符
元字符: .
匹配规则:匹配除换行外的任意一个字符
In : re.findall(‘张.丰’,“张三丰,张四丰,张五丰”)
Out: [‘张三丰’, ‘张四丰’, ‘张五丰’] - 匹配字符集
元字符: [字符集]
匹配规则: 匹配字符集中的任意一个字符
表达形式:
[abc#!好] 表示 [] 中的任意一个字符
[0-9],[a-z],[A-Z] 表示区间内的任意一个字符
[_#?0-9a-z] 混合书写,一般区间表达写在后面 - 匹配字符集反集
元字符:[^字符集]
匹配规则:匹配除了字符集以外的任意一个字符
In : re.findall(‘[^0-9]’,“Use 007 port”)
Out: [‘U’, ‘s’, ‘e’, ’ ', ’ ', ‘p’, ‘o’, ‘r’, ‘t’] - 匹配任意(非)数字字符
元字符: \d \D
匹配规则:\d 匹配任意数字字符,\D 匹配任意非数字字符
In : re.findall(‘\d{1,5}’,“Mysql: 3306, http:80”)
Out: [‘3306’, ‘80’ - 匹配任意(非)普通字符
元字符: \w \W
匹配规则: \w 匹配普通字符,\W 匹配非普通字符
说明: 普通字符指数字,字母,下划线,汉字。
In : re.findall(‘\w+’,“server_port = 8888”)
Out: [‘server_port’, ‘8888’] - 匹配任意(非)空字符
元字符: \s \S
匹配规则: \s 匹配空字符,\S 匹配非空字符
说明:空字符指 空格 \r \n \t \v \f 字符
In : re.findall(‘\w+\s+\w+’,“hello world”)
Out: [‘hello world’]
二、匹配位置
- 匹配字符串开始位置
元字符: ^
匹配规则:匹配目标字符串的开头位置
In : re.findall(‘^Jame’,“Jame,hello”)
Out: [‘Jame’] - 匹配字符串的结束位置
元字符: $
匹配规则: 匹配目标字符串的结尾位置
In : re.findall(‘Jame$’,“Hi,Jame”)
Out: [‘Jame’] - 匹配(非)单词的边界位置
元字符: \b \B
匹配规则: \b 表示单词边界,\B 表示非单词边界
说明:单词边界指数字字母(汉字)下划线与其他字符的交界位置。
In : re.findall(r’\bis\b’,“This is a test.”)
Out: [‘is’]
三、匹配重复
元字符: *
匹配规则:匹配前面的字符出现0次或多次
In : re.findall(‘wo*’,“wooooo~~w!”)
Out: [‘wooooo’, ‘w’]
元字符:+
匹配规则: 匹配前面的字符出现1次或多次
In : re.findall(‘[A-Z][a-z]+’,“Hello World”)
Out: [‘Hello’, ‘World’]
元字符:?
匹配规则: 匹配前面的字符出现0次或1次
In: re.findall(‘-?[0-9]+’,“Jame,age:18, -26”)
Out: [‘18’, ‘-26’]
元字符:{n}
匹配规则: 匹配前面的字符出现n次
In : re.findall(‘1[0-9]{10}’,“Jame:13886495728”)
Out: [‘13886495728’]
元字符:{m,n}
匹配规则: 匹配前面的字符出现m-n次
In : re.findall(‘[1-9][0-9]{5,10}’,“Baron:1259296994”)
Out: [‘1259296994’]
四、其他
- 或关系
元字符: |
匹配规则: 匹配 | 两侧任意的正则表达式即可
In : re.findall(‘com|cn’,“www.baidu.com/www.tmooc.cn”)
Out: [‘com’, ‘cn’] - 正则表达式的转义
2.1如果使用正则表达式匹配特殊字符则需要加 \ 表示转义。
特殊字符: . * + ? ^ $ [] () {} |
2.2在编程语言中,常使用原生字符r串书写正则表达式避免多重转义的麻烦。 - 贪婪模式和非贪婪模式
贪婪模式转换为非贪婪模式:在匹配重复元字符后加 ‘?’ 号即可
* : *?
+ : +?
? : ??
{m,n} : {m,n}?
五、正则表达式分组
在正则表达式中,以()建立正则表达式的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象。
捕获组:
可以给正则表达式的子组起一个名字,表达该子组的意义。这种有名称的子组即为捕获组。
格式:(?Ppattern)
e.g. 给子组命名为 “pig”
In : re.search(r’(?Pab)+',“ababababab”).group(‘pig’)
Out: ‘ab’
re模塊常量
- re.IGNORECASE: 进行忽略大小写匹配。
- re.ASCII: 匹配ASCII编码支持的字符
- re.DOTALL: .
匹配所有,包括换行符
\n - re. MULTILINE: 多行模式
- re.VERBOSE: 详细模式,可以在正则表达式中加注解!
re模塊函數
- 查找一個匹配項
返回值都是一个 匹配对象Match ,需要通过match.group() 获取匹配值
- search: 查找任意位置的匹配项
- match: 必须从字符串开头匹配
- fullmatch: 整个字符串与正则完全匹配
- 查找多個匹配項
如果可能存在大量的匹配项的话,建议使用finditer函数,一般情况使用findall函数基本没啥影响。
- findall: 从字符串任意位置查找,返回一个列表
- finditer:从字符串任意位置查找,返回一个迭代器
- 替換
re.sub(pattern, repl, string, count=0, flags=0) 函数参数讲解:repl替换掉string中被pattern匹配的字符, count表示最大替换次数,flags表示正则表达式的常量。 - 編譯正則對象
compile函数将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern),这个对象与re模块有同样的正则函数
import re
text = 'xxx'
pattern = r'xxx'
pattern_obj = re.compile(pattern)
pattern_obj.search(text).group()
注意事項
- 字節串與字符串
模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes)。 但是,Unicode 字符串与8位字节串不能混用!
- r的作用
正则表达式使用反斜杠(‘’)来表示特殊形式,或者把特殊字符转义成普通字符。
而反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突。
解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 ‘r’ 前缀的字符串字面值中,反斜杠不必做任何特殊处理。
- 重複使用某個正則
如果要重复使用某个正则表达式,推荐先使用 re.compile(pattern)函数 返回一个正则对象,然后复用这个正则对象,这样会更快!