Loading

正则表达式

 

正则在线测试工具:https://regexr-cn.com/
正则练习网站:https://codejiaonang.com/
 
元字符
. * + ? \ [ ] ^ $ { } | ( )
 
匹配固定字符串
content = '身高:178,体重:168,学号:123456,密码:7654'
result = re.findall(r'7654', content)
print(result)  # ['7654']

'''
findall表示匹配所有满足条件的字符串,如果有多少个满足的条件会全部匹配
由于字符串中可能会有一些特殊字符,r代表python不要去转义里面的的特殊字符
'''
匹配某一类字符
content = '身高:178,体重:168,学号:123456,密码:7654'
result = re.findall(r'\d', content)
print(result)  # ['1', '7', '8', '1', '6', '8', '1', '2', '3', '4', '5', '6', '7', '6', '5', '4']

'''
\d代表数字
匹配字符串中的所有数字
'''
匹配重复某一类字符
content = '身高:178,体重:168,学号:123456,密码:7654'
result = re.findall(r'\d+', content)
print(result) # ['178', '168', '123456', '7654']

''' 
+修饰的是前面的表达式
\d代表数字,+代表1到多个
\d数字开始 +表示多个,所以匹配出了每个完整的数字串
'''
匹配出座机号码
content = '手机号A:1778787877,手机号B:178817171,座机:0571-52122521'
result = re.findall(r'\d{4}-\d{8}', content)
print(result) # ['0571-52122521']

'''
\d表示数字
{number} 表示多少个数字
\d{4}是4个数字,-连接\d{8}匹配8个数字
'''
匹配多种情况
content = '手机号A:1778787877,手机号B:1718817171,座机:0571-52122521'
result = re.findall(r'\d{4}-\d{8}|\d{9}', content)
print(result) # ['177878787', '178817171', '0571-52122521']

'''
|表示或者的意思
|\d{9} 表示或者匹配9个数字
'''
 
匹配限定位置
content = '1778787877,手机号B:2718817171,座机:0571-52122521'
result = re.findall(r'^\d{5}|\d{4}-\d{8}', content)
print(result) #['17787', '0571-52122521']

'''
^表示在句子的开头,$表示在句子的结尾
'''
内部约束
content = 'barbar carcar harhel'
result = re.findall(r'(\w{3})(\1)', content)
print(result) [('bar', 'bar'), ('car', 'car')]
'''
\w表示字符,{3}表示3次
(\1)表示跟第一个括号的内容一致
'''
写正则表达式的五个步骤
  • 1.确定包含几个子模式
  • 2.各个部分的字符分类是什么
  • 3.各个部分如何重复
  • 4.是否有外部位置限制
  • 5.是否有内部制约关系
语法规则
字符类表达式
a,啊:字符常量:写什么就是什么
\d:一个数字
\D: 一个非数字字符
\s: 一个空格
\S: 一个非空格
\w: 一个任意字母数字下划线字符
\W: 一个出了字母数字下划线之外的任意字符
[Aacs]:  A,a,c,s 中的任意一个字符
[a-e]:  范围:从字母a到e的任意一个字符
[1-9]:  从数字1到9的任意一个字符
[^a-d]:  取反:除了a、b、c、d之外的任意字符
[\b]:  退格符号 Backspace
.:  统配符,除了换行\n之外的任意的一个字符
字符的重复次数,也叫做两次,比如身份证重复15或者18次,也就是\d{15}|\d{18}
重复次数-量词
* : 0或多个
+ : 1或多个
?:  0或1个
{2}:2个
{2,5}: 2到5个
{2,}: 至少2个
{,5}: 最多5个
组合模式
组合模式:多个模式拼在一起组成一个大的模式,比如\d{6}[a-z]{6}表示6个数字后跟6个小写字母
多种模式:用竖线|表示,两种模式都可以
分组模式:用括号()表示分组,分组后可以以租为单位应用两次,如(abc){3}表示abcacb'acb
位置
^字符串开头
\A:字符串开头,忽略m标记,不受换行m的影响
$:字符串行尾
\Z:字符串行尾,忽略m标记,不受换行m的影响
\b:单词边界,比如123abc123, \d\b匹配单词边界的最后一个数字就是3
\B:非单词边界:比如123abc123,\d\B匹配非单词边界的所有数字,12312,没有最后的3
(?=...):匹配...出现在之后的位置,我我测试32323,(?=测试).*,匹配测试32323
(?!...):匹配...不出现在之后的位置
(?<=...)匹配...出现在之前的位置
(?<!...)匹配...不出现在之前的位置
(?(|)):条件语句
分组
可以把一个正则表达式分成几个部分,可以重复某个分组或者指定两个分组必须相同等额外要求
(...)捕获一个组
(?P<Y>...) 捕获组名为Y
(?:...) 不捕获组
\Y:匹配第Y个匹配到的组
(?P=Y):匹配名为Y的组
(?#...) 注释
 
标记
i  #忽略大小写
m  #^和$匹配行首和行尾
s  #.匹配换行符
x  #允许空格和注释
\L #由当前语言区域决定 ,\w,|w,\b,\B 和大小写敏感匹配
(?iLmsux) #再正则表达式中设置标记
 
#语法
# 在文本参数后传入标记,格式:re.标记
re.split('\w', comtent, re.I) 
特殊字符
\n  换行符
\r  回车符
\t  tab符号
\YYY  八进制符号YYY
\xYY  16进制符号YY
替换
\g<0>  插入整段匹配
\g<Y>  插入匹配Y,Y可以是匹配的名字或者数字
\Y     插入名为Y的数组
python的re模块语法
re.search():查找符合模式的字符,只返回第一个,返回match对象
re.match():和search一样,但要求必须从字符串开头匹配,返回match对象
re.findall():返回所有匹配的字符串列表,返回对应内容
re.finditer():返回一个迭代器,其中包含所有的匹配,也就是Match对象
re.sub():替换匹配的字符串,返回替换完成的文本
re.subn():替换匹配的字符串,返回替换完成的文本和替换的次数
re.split():用匹配表达式的字符串做分隔符分割原字符串
re.compile():把正则表达式编译成一个对象,方便后面使用
match对象.group(param): 显示对象匹配的内容,param:如果有多个分组,可以指定数字显示第几个组的内容
match对象.groups():显示对象匹配内容,多个组返回元组展示
# search匹配示例
content = 'barbar carcar harhel'
result = re.search(r'ar', content)  # match对象:<re.Match object; span=(1, 3), match='ar'>
print(result.group())  # 匹配到的第一个ar

# 分组匹配及返回示例
content = '010-12321312'
result = re.search(r'(\d+)-(\d+)', content)  # 两个分最
print(result.group())  # 010-12321312 全部内容
print(result.group(1))  # 010  第一个组的内容
print(result.group(2))  # 12321312第二个组的内容
print(result.groups()) # ('010', '12321312')


# 替换示例
content = '010-12321312'
# 匹配要求-要替换成什么内容,匹配的文本
result = re.sub(r'010', '7', content)
print(result)  # 7-12321312 将010替换成7


# 匹配要求-要替换成什么内容,匹配的文本
result = re.subn(r'010', '7', content)

print(result)  # ('7-12321312', 1) ,(替换后的内容,替换了几次)



# 分割
content = 'foo,bar  ;  baz / qux'

'''
\s* 匹配空格
[,;/] 要分割的标记
\s* 匹配空格
'''
result = re.split(r'\s*[,;/]\s*', content)
print(result)  # ['foo', 'bar', 'baz', 'qux']
 

posted @ 2022-10-12 17:56  木子七  阅读(57)  评论(0编辑  收藏  举报