正则表达式是一种表达式语句,用于对字符串类型数据进行操作,包含从字符串中筛选出满足表达式条件的信息,将字符串中的内容进行替换等功能。在python中通过re库实现。
一、匹配字符串
1.1 match()函数
使用形式:
match(参数1,参数2)
功能:表示从参数2(字符串类型数据)中查找满足参数1(正则表达式)的内容,如果参数2起始位置匹配不成功的话,就返回none,如果起始位置匹配成功,就返回匹配的内容。
import re
message = '张三、李四、王五、赵六'
result = re.match('张三',message) #只能从字符串开头开始匹配,并且要求匹配内容与开头完全对齐
print(result)
import re
message = '张三、李四、王五、赵六'
result = re.match('张三、李四',message)
print(result)
1.2 search()函数
使用形式:
search(参数1,参数2)
功能:
表示从参数2(字符串类型数据)中查找满足参数1(正则表达式)的内容,如果匹配了多个参数1,则只返回第一个匹配成功的信息。
import re
message = '张三、李四、王五、赵六'
result = re.search('王五',message)
print(result)
1.2 findall()函数
使用形式:
findall(参数1,参数2)
功能:表示从参数2(字符串类型数据)中查找满足参数1(正则表达式)的内容,如果匹配了多个参数1,则返回匹配成功的全部信息(列表形式)
import re
message = '张三、李四、王五、赵六、王五'
result = re.findall('王五',message)
print(result)
二、正则表达式
2.1 表示字符范围
[xyz] :字符集合,匹配所包含的任意一个字符。如[abc]匹配字符a或者b或者c。
[a-z] :字符范围,匹配指定范围内的任意字符(区分大小写)。如[a-z]匹配a到z范围内的任意小写字母,[0-9]匹配从0到9的任意数字。
import re
message = 'Python93,C87,Java63,C++88'
result_1 = re.search('[cn]',message)
result_2 = re.findall('[0-9]',message)
result_3 = re.findall('[cn]*[0-9]',message)
print(result_1,result_2,result_3)
2.2 表示字符出现的次数
*:匹配前面的子表达式任意次(大于等于0次)。如zo*能匹配''z''、'zo''、''zoo'',等价于{0,}
+:匹配前面的子表达式一次或多次。如''zo+''可以匹配''zo''和''zoo'',但不能匹配''z'',等价于{1,}。
?:匹配前面的子表达式0次或者一次,如do(es)?可以匹配''do''或者''does'',?等价于{0,1}。
^:匹配输入行首。
$:匹配输入行尾。
{n}:匹配n次,n为非负整数。如o{2}可以匹配''food''中的oo,不能匹配''Bob''中的o。
{n,}至少匹配n次,n为非负整数,如o{2}可以匹配''foooood'中的oooooo',不能匹配''Bob''中的o,o{1,}等价于o+,o{0,}等价于o*
{n,m}:最少匹配n次且最多匹配m次,m和n均为非负整数且n<m,如o{1,3}可以匹配‘’fooooood‘中的前三个'ooo'和后三个'ooo'。o{0,1}等价于o?,注意:逗号和两个数之间不能有空格。
import re
message = 'da2a7ddbre77yifed777t3fefd7777b'
result = re.findall('[a-z]*[0-9][a-z]',message)
print(result)
2.3 表示同一类字符
\\d :匹配一个数字类字符,等价于[0-9]
\\D :匹配一个非数字类字符,等价于[^0-9],^在方括号中表示非,即不匹配输入字符中的首位字符
\\s :匹配任何不可见字符,包括空格、制表符、分页符等,等价于[\\f\\n\\r\\t\\v]
\\S :匹配任何可见字符,等价于[^\\f\\n\\r\\t\\v]
\\w :匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
\\W :匹配任何不包括下划线的非单词字符,等价于[^A-Za-z0-9_]
正则表达式中所谓的“单词”,就是由“\\w”所定义的字符所组成的子串。
边界:边界是指一个位置,而不是某一个具体的字符
单词的边界:表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置(匹配一个边界,一边字符是\\w,一边字符不是\\w)
非单词的边界:匹配除 \\b 之外的边界。两边字符都是\\w,或两边字符都不是\\w
\\b :匹配一个单词的边界
\\B :匹配一个非单词的边界
\\f :匹配一个分页符
\\n :匹配一个换行符
\\r :匹配一个回车符
\\t :匹配一个制表符
\\v :匹配一个垂直制表符
. :匹配除''\\n''和''\\r''之外的任何单个字符。
import re
use_name = input("请输入您的用户名:")
result = re.findall(r'^[A-Za-z_]\\w{7,}$', use_name)
print(result)
message = 'verb very never every'
result = re.findall(r'\\w+er\\B', message) # \\b是转义字符
print(result)
三、贪婪和非贪婪模式
贪婪模式:默认匹配模式都是贪婪模式,匹配形式是尝试匹配尽可能多的字符,只要满足正则表达式的要求就会匹配最多的字符。
import re
message = 'ccc739134792hd'
result = re.findall(r'ccc\\d+', message)
print(result)
非贪婪模式:匹配形式是尝试匹配尽可能少的字符,一旦满足正则表达式的要求就不再匹配,在次数限制操作符后加上"?"就可以将匹配模式转换为非贪婪模式。
import re
message = 'ccc739134792hd'
result = re.findall(r'ccc\\d+?', message)
print(result)
四、或和组
或:用'|'表示,表示将两个匹配条件进行逻辑“或”(or)运算
import re
message = 'verb very never every'
result = re.findall(r'\\w+ev|\\w+ry', message)
print(result)
组:用“(表达式)”表示,表示将()中的表达式定义为组,并且将匹配这个表达式的字符保存到一个临时区域(一个是正则表达式最多可以保存9个组)。
import re
message = 'verb very never every'
result = re.findall(r"e(.+)(.)r", message)
print(result)
五、sub()和compile()方法
sub()方法
使用形式:
sub(参数1,参数2,参数3)
功能:将字符串参数3中所有与参数1匹配的字符替换为参数2.
import re
content = 'dh932hf9f934hfnf39d'
content = re.sub( '\\d', '0',content)
print(content)
compile()方法
使用形式:
re.compile(pattern, flags=0)
pattern(必选参数):
作用:定义你要匹配的正则表达式规则,是字符串类型。
flags(可选参数,默认值 = 0):
作用:设置正则匹配的 “修饰符”,改变匹配的行为(比如忽略大小写、多行模式等)。
import re
contentl = '2020 12 15 12:00'
pattern = re.compile('\\d{2}:\\d{2}')
print(pattern.findall(contentl))


