正则表达式 re库的使用

文章目录

  • 常见匹配模式
  • 正则表达式的表示类型
  • re的主要功能函数
    • match对象的属性与方法
      • match对象的属性
      • match对象的方法
    • 1. re.search (正则表达式,字符串 [,匹配模式])
    • 2. re.match (正则表达式,字符串 [,匹配模式])
    • 3. re.findall
    • 4. re.split
    • 5. re.finditer (正则表达式,字符串 [,匹配模式])
    • 6. re.sub (正则表达式, repl, 被替换的字符串 [, count=0, flags=0] )
    • 7. re.compile

常见匹配模式

模式 描述
^ 匹配 字符串的开始
\w 匹配 字母数字及下划线
\W 匹配 字母数字及下划线
\s 匹配 任意空白字符,即空格
\S 匹配 任意非空字符
\d 匹配 任意数字,等价于[0-9], \d+ 表示匹配多个数字
\D 匹配 任意数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
. 匹配任意字符,除了换行符
[…] 用来表示一组字符,单独列出;例[abc], 匹配字符’a’, ‘b’, ‘c’
[^…] 不在[] 中的字符;例[^abc], 匹配除了字符’a’, ‘b’, ‘c’ 外的所有字符
* 匹配 0个或多个的表达式
+ 匹配 1个或多个的表达式
? 匹配 0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精准匹配 n个前面表达式
{n,m} 匹配 n到m次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配 a或b
() 匹配括号内的表达式,也表示一个组
& 匹配字符串的末尾

正则表达式的表示类型

re 库采用 raw string 类型表示正则表达式,表示为 r'正则表达式'

raw string 是不含 转义符的字符串

re的主要功能函数

函数 说明
re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回 match 对象
re.match() 从一个字符串的开始位置起匹配正则表达式,返回 match 对象
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是 match 对象
re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

函数参数:

  • pattern :正则表达式的字符串
  • string :待匹配字符串
  • flags : 正则表达式使用时的控制标记
    • re.I : 忽略正则表达式的大小写,即对大小写不敏感,[A-Z]能够匹配小写字符
    • re.M : 多行匹配,影响^和$
    • re.S :匹配包括换行符在内的所有字符

match对象的属性与方法

match对象的属性

  • match.string 返回待匹配的文本

  • match.re 返回正则表达式

  • match.pos 正则表达式开始搜索的位置

  • match.endpos 正则表达式搜索结束的位置

match对象的方法

  • match.group() 获得匹配后的字符串

  • match.start() 所匹配的字符串在原字符串的开始位置

  • match.end() 所匹配的字符串在原字符串的结束位置

  • match.span() 返回(match.start(),match.end())的元组

1. re.search (正则表达式,字符串 [,匹配模式])

search() 函数会扫描整个字符串,并且用 group() 函数 返回第一个满足正则表达式的字符串,匹配失败返回 None

re.search() 并不要求必须从字符串的开头进行匹配,也就是说,正则表达式可以是字符串任意位置开始的子串。

import re

str1 = '##123Abc!@#你好呀\n\r'
ret = re.search('\w',str1)
print(ret)
print(ret.group())
print(ret.span())

--> <re.Match object; span=(2, 3), match='1'>
--> 1
--> (2, 3)

2. re.match (正则表达式,字符串 [,匹配模式])

match() 函数和search() 函数的功能差不多,区别是 match() 函数是必须从字符串的开头匹配,如果开头不满足正则表达式,后面满足正则表达式的字符串也不会被匹配到。

example1:

import re

str1 = '##123Abc!@#你好呀\n\r'
ret = re.match('\W\W\w',str1)
print(ret)
print(ret.group())
print(ret.span())

--> <re.Match object; span=(0, 3), match='##1'>
--> ##1
--> (0, 3)

example2:

import re

str1 = '##123Abc!@#你好呀\n\r'
ret = re.match('\w',str1)
print(ret)

--> None

3. re.findall

  • 语法格式 re.findall('正则表达式',文本内容,修饰符)

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

import re
 
text = '2023年,6月份, 23日'
pattern = re.compile(r'\d{4}年|\d{1}月|\d{2}日')
res = pattern.findall(text)
print(res)

--> ['2023年', '6月', '23日']

4. re.split

  • 语法格式 re.split('正则表达式','文本',[maxsplit=0])

maxsplit是允许被分割成几个子串,默认为 0,不限制次数。

import re
ret = re.split('\W+', 'runoob, runoob, runoob.')
print(ret)

ret = re.split('(\W+)', ' runoob, runoob, runoob.') 
print(ret)

ret = re.split('\W+', ' runoob, runoob, runoob.', 1) 
print(ret)
 
ret = re.split('aa*', 'hello world')   # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
print(ret)

--> ['runoob', 'runoob', 'runoob', '']
--> ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
--> ['', 'runoob, runoob, runoob.']
--> ['hello world']

5. re.finditer (正则表达式,字符串 [,匹配模式])

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

ret = re.finditer('\w',str1)
for i in ret:
    print(i.group(),end='')#输出时不换行

6. re.sub (正则表达式, repl, 被替换的字符串 [, count=0, flags=0] )

re 模块提供了re.sub用于替换字符串中的匹配项。

repl 可以是替换的字符串,也可为一个函数。
count 表示模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

example1: repl 为字符串

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
 
phone = "2004-959-559 # 这是一个国外电话号码"
 
# 删除字符串中的 Python注释 
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
 
# 删除非数字(-)的字符串 
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num

--> 电话号码是:  2004-959-559 
--> 电话号码是 :  2004959559

7. re.compile

该函数将创建一个正则表达式的对象,可以实现更有效率的复用。

import re
find_xx = re.compile('正则表达式',修饰符)
ret = find_xx.search(带匹配的字符串)

你可能感兴趣的:(Python,正则表达式)