文章目录

  • 正则表达式匹配原则:
  • 一、匹配字符:
  • 二、匹配位置
  • 三、匹配重复
  • 四、其他
  • 五、正则表达式分组
  • re模塊常量
  • re模塊函數
  • 注意事項


正则表达式匹配原则:

1.正确性,能够正确的匹配出目标字符串.
2.排他性,除了目标字符串之外尽可能少的匹配其他内容.
3.全面性,尽可能考虑到目标字符串的所有情况,不遗漏.

一、匹配字符:

  1. 普通字符
    匹配规则:每个普通字符匹配其对应的字符
    In : re.findall(‘ab’,“abcdefabcd”)
    Out: [‘ab’, ‘ab’]
  2. 匹配单个字符
    元字符: .
    匹配规则:匹配除换行外的任意一个字符
    In : re.findall(‘张.丰’,“张三丰,张四丰,张五丰”)
    Out: [‘张三丰’, ‘张四丰’, ‘张五丰’]
  3. 匹配字符集
    元字符: [字符集]
    匹配规则: 匹配字符集中的任意一个字符
    表达形式:
    [abc#!好] 表示 [] 中的任意一个字符
    [0-9],[a-z],[A-Z] 表示区间内的任意一个字符
    [_#?0-9a-z] 混合书写,一般区间表达写在后面
  4. 匹配字符集反集
    元字符:[^字符集]
    匹配规则:匹配除了字符集以外的任意一个字符
    In : re.findall(‘[^0-9]’,“Use 007 port”)
    Out: [‘U’, ‘s’, ‘e’, ’ ', ’ ', ‘p’, ‘o’, ‘r’, ‘t’]
  5. 匹配任意(非)数字字符
    元字符: \d \D
    匹配规则:\d 匹配任意数字字符,\D 匹配任意非数字字符
    In : re.findall(‘\d{1,5}’,“Mysql: 3306, http:80”)
    Out: [‘3306’, ‘80’
  6. 匹配任意(非)普通字符
    元字符: \w \W
    匹配规则: \w 匹配普通字符,\W 匹配非普通字符
    说明: 普通字符指数字,字母,下划线,汉字。
    In : re.findall(‘\w+’,“server_port = 8888”)
    Out: [‘server_port’, ‘8888’]
  7. 匹配任意(非)空字符
    元字符: \s \S
    匹配规则: \s 匹配空字符,\S 匹配非空字符
    说明:空字符指 空格 \r \n \t \v \f 字符
    In : re.findall(‘\w+\s+\w+’,“hello world”)
    Out: [‘hello world’]

二、匹配位置

  1. 匹配字符串开始位置
    元字符: ^
    匹配规则:匹配目标字符串的开头位置
    In : re.findall(‘^Jame’,“Jame,hello”)
    Out: [‘Jame’]
  2. 匹配字符串的结束位置
    元字符: $
    匹配规则: 匹配目标字符串的结尾位置
    In : re.findall(‘Jame$’,“Hi,Jame”)
    Out: [‘Jame’]
  3. 匹配(非)单词的边界位置
    元字符: \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’]

四、其他

  1. 或关系
    元字符: |
    匹配规则: 匹配 | 两侧任意的正则表达式即可
    In : re.findall(‘com|cn’,“www.baidu.com/www.tmooc.cn”)
    Out: [‘com’, ‘cn’]
  2. 正则表达式的转义
    2.1如果使用正则表达式匹配特殊字符则需要加 \ 表示转义。
    特殊字符: . * + ? ^ $ [] () {} |
    2.2在编程语言中,常使用原生字符r串书写正则表达式避免多重转义的麻烦。
  3. 贪婪模式和非贪婪模式
    贪婪模式转换为非贪婪模式:在匹配重复元字符后加 ‘?’ 号即可
    * : *?
    + : +?
    ? : ??
    {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)函数 返回一个正则对象,然后复用这个正则对象,这样会更快!