Python里的re模块

re正则表达式

正则表达式:普通字符和元字符构成的字符串,描述一类字符串规则

import re
match 就是从左往右匹配,匹配了就返回结果,如果匹配不上就会返回None,如果不是起始位置匹配成功的话返回的也是None。即如果匹配的字符串不在开头,而是在中间或者结尾,则无法匹配
​
findall就是把能匹配上的都放到列表里面去

元字符含义
.任意一个字符(不包括\n)
\d一个数字
\s空白字符
\S非空白字符
[]包含[]内容
*出现0次或多次
+出现1次或多次

元字符

匹配单个字符
​
. 表示任意一个字符,但是除了\n,从第一位开始匹配,从左往右

import re
print(re.match('.', 'web')) #<re.Match object; span=(0, 1), match='w'>
print(re.match('.', 'eweb')) #<re.Match object; span=(0, 1), match='e'>
print(re.match('.', '@web')) #<re.Match object; span=(0, 1), match='@'>
print(re.match('...', 'web')) # <re.Match object; span=(0, 3), match='web'>
print(re.match('.','\nweb')) # None
​
\d 表示0-9之间任意一个数字
import re
print(re.match('\d', '@web'))  # None
print(re.match('\d', '2@web')) # <re.Match object; span=(0, 1), match='2'>
print(re.match('\d', '0@web')) # <re.Match object; span=(0, 1), match='0'>
print(re.match('\d', '@0web')) # None
print(re.findall('\d', '@0web'))  # ['0']
​
\D 表示非数字
import re
print(re.match('\D', '@0web'))  # <re.Match object; span=(0, 1), match='@'>
print(re.match('\D', '0web'))  # None
print(re.match('\D', '\n0web'))  # <re.Match object; span=(0, 1), match='\n'>
​
\s 表示空白字符串  \n  \t
import re
print(re.match('\s', ' '))  # <re.Match object; span=(0, 1), match=' '>
print(re.match('\s', '\n')) #<re.Match object; span=(0, 1), match='\n'>
print(re.match('\s', '\t')) #<re.Match object; span=(0, 1), match='\t'>
print(re.match('\s', '1\n')) # None
\S 表示非空白
import re
print(re.match('\S', '\t'))  # None
print(re.match('\S', '\\'))  #<re.Match object; span=(0, 1), match='\\'>  # \\转义之后就是\
​
\w 英文字母,数字,下划线
import re
print(re.match('\w', '\\'))  # None
print(re.match('\w', '_\\')) # <re.Match object; span=(0, 1), match='_'>
print(re.match('\w', 'A_\\')) # <re.Match object; span=(0, 1), match='A'>
​
\W 非英文字母,数字,下划线
import re
print(re.match('\W', 'A_\\')) # None
字符集,只能匹配单个字符,使用`[]`来表示,表示一个字符的范围,注意还是匹配一个字符,第一个字符开始匹配看是不是在这个范围内,如果第一个字符不在,第二个字符在,它也匹配不到

​import re
print(re.match('[abcd]', 'abc'))  # <re.Match object; span=(0, 1), match='a'>
print(re.match('[abcd]', 'zabc'))  # None
print(re.findall('[abcd]', 'zabc'))  # ['a', 'b', 'c']
​
- 表示一个范围

print(re.findall('[a-d]', 'zabc')) #['a', 'b', 'c']
print(re.findall('[a-z]', 'zabc')) #['z', 'a', 'b', 'c']
print(re.match('[a-z]', 'A'))  # None
print(re.match('[A-Z]', 'A'))  # <re.Match object; span=(0, 1), match='A'>
print(re.match('[a-zA-Z]', 'w'))  # <re.Match object; span=(0, 1), match='w'>
print(re.findall('[a-zA-Z]', 'Aabc'))  # ['A', 'a', 'b', 'c']
print(re.findall('[A-z]', 'Aabc'))  # ['A', 'a', 'b', 'c']
注意:字符集匹配字母不能是从小写的a-Z

print(re.match('[0-9]', '3A'))  # <re.Match object; span=(0, 1), match='3'>
print(re.findall('[0-9A-z]', '3A'))  # ['3', 'A']
​
​
^ 取反,写在字符集里面

print(re.match('[^a-e]', 'e'))  # None
​
多字符匹配
import re
print(re.match('[0-9]', '11'))  # <re.Match object; span=(0, 1), match='1'>
print(re.match('11', '11'))  # <re.Match object; span=(0, 2), match='11'>
print(re.match('[0-9][0-9]', '11'))  # <re.Match object; span=(0, 2), match='11'>
print(re.match('[0-9][0-9]', '1a'))  # None
print(re.match('[0-9][a-z]', '1a'))  # <re.Match object; span=(0, 2), match='1a'>
 
 
import re
print(re.match('\d\w', '1a')) #<re.Match object; span=(0, 2), match='1a'>
print(re.match('\w\W', '1a')) #None
print(re.match('\w\w', '1a')) #<re.Match object; span=(0, 2), match='1a'>
 

数量规则

匹配电话号码:15096078912
​
* 匹配前一个字符的任意次数,包括0次

print(re.match('\d*', '15096078912')) # <re.Match object; span=(0, 11), match='15096078912'>
print(re.match('\d*', '15096a078912')) # <re.Match object; span=(0, 5), match='15096'>
print(re.match('\w*', '15096a078912')) # <re.Match object; span=(0, 12), match='15096a078912'>
print(re.match('\w*', '15096=a078912')) # <re.Match object; span=(0, 5), match='15096'>
​
+ 匹配前一个字符  重复匹配1次以上,0次不行,只要出现1次以上就符号

print(re.match('\w+', '15096a078912')) # <re.Match object; span=(0, 12), match='15096a078912'>
print(re.match('\d+', '1a717752')) # <re.Match object; span=(0, 1), match='1'>
print(re.match('\d*','a717752')) # <re.Match object; span=(0, 0), match=''>
print(re.match('\d+','a717752'))  # None
​
? 匹配前一个字符出现0次或者1次,只能匹配一个

print(re.match('\d?', '15096a078912')) # <re.Match object; span=(0, 1), match='1'>
print(re.match('\d?', '')) # <re.Match object; span=(0, 0), match=''>
​
{m}   匹配前一个字符的m次
{m,}  至少匹配m次以上
{m,n} 匹配m次以上,n次以下
print(re.match('\d{3}', '15096078912'))  # <re.Match object; span=(0, 3), match='150'>
print(re.match('\d{3,}', '15096078912')) # <re.Match object; span=(0, 11), match='15096078912'>
print(re.match('\d{3,6}', '15096078912')) # <re.Match object; span=(0, 6), match='150960'>

边界处理

^ 不是取反,边界开始
$ 边界结束
​
电话号码:
第一位 [1]
第二位 [358]
第三位 [56789]
后面八位任意
print(re.match('^1[358][5-9]\d{8}$', '15596078912'))  # <re.Match object; span=(0, 11), match='15596078912'>
print(re.match('^1[358][5-9]\d{8}', '1559607891289'))  # <re.Match object; span=(0, 11), match='15596078912'>
print(re.match('^1[358][5-9]\d{8}$', '1559607891289'))  # None
print(re.match('^1[358][5-9]\d{8}$', '155960789aaa'))  # None

分组匹配

|   或者
()  分组
print(re.match('\d{4}-\d{2}-\d{2}', '2022-13-33'))  # <re.Match object; span=(0, 10), match='2022-13-33'>
print(re.match('\d{4}-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31'))  # <re.Match object; span=(0, 10), match='2022-12-31'>
print(re.match('\d{4}-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31').group(0)) # 显示全部 2022-12-31
print(re.match('\d{4}-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31').group(1)) # 显示月份  12
print(re.match('\d{4}-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31').group(2)) # 显示天数   31
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31').group(1)) # 显示年份  2022
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31').group(2)) # 显示月份  12
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31').group(3)) # 显示天数  31
print(re.match('(\d{4})-(0[1-9]|1[0-2])-([0-2]\d|[3][0-1])', '2022-12-31').groups()) # ('2022', '12', '31')
\1  代表第一个分组中的内容
\2  代表第二个分组中的内容

context = '<title>abcd</title>'
print(re.match(r'<title>([\w\W]*)</title>',context))  # <re.Match object; span=(0, 19), match='<title>abcd</title>'>
print(re.match(r'<(\w+)>([\w\W]*)</\1>',context).group(1))  # title
​
分组取别名(要在分组里面):?P<别名>
print(re.match(r'<(?P<tag>\w+)>([\w\W]*)</(?P=tag)>', context).group(1))  # title
print(re.match(r'<(?P<tag>\w+)>([\w\W]*)</(?P=tag)>', context).group())  # <title>abcd</title>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值