元字符总结:
正则表达式常用的元字符有^,$, . , \b ,\w, \W, \s , \S, \d, \D,各自的功能如下
^:匹配行的开始位置
$ : 匹配行的结束位置
\b : 匹配单词的开始或者结束位置
. : 匹配除换行符之外的任意字符
\w :匹配单词字符(包括字母,数字,下划线和汉字)
\W : 匹配任意非单词字符(包括字母,数字,下划线和汉字)
\s : 匹配任意的空白字符,如空格,制表符,换行符
\S : 匹配任意的非空白字符
\d : 匹配任意的数字
\D : 匹配任意的非数字
| :或者的意思
():在这里里面选择
(?:\w+\.)* 以句点作为结尾的字符串,例如“google.”、“twitter.”、“facebook.”,但是这些匹配不会保存下来 供后续的使用和数据检索
(?#comment) 此处并不做匹配,只是作为注释
(?=.com) 如果一个字符串后面跟着“.com”才做匹配操作,并不使用任何目标字符串
(?!.net) 如果一个字符串后面不是跟着“.net”才做匹配操作
(?<=800-) 如果字符串之前为“800-”才做匹配,假定为电话号码,同样,并不使用任何输入字符串
(?<!192\.168\.)如果一个字符串之前不是“192.168.”才做匹配操作,假定过滤掉一组C类IP地址
(?(1)y|x) 如果一个匹配组 1(\1)存在,就与 y 匹配;否则,就与 x 匹配
注意:(?=XXX)表示结尾要是什么才匹配(?!xxx)表示结尾不是什么才匹配
(?<=XXX)表示需要匹配的字符串之前需要是XXX
(?<!XXX)表示需要匹配的字符串之前不能为XXX才匹配
匹配邮箱:
import re
while True:
var = input("输入你的邮箱地址:")
result = re.match(r"^[0-9a-zA-Z_]{4,20}@(163|126|q{2}|outlook)\.com$",var)# |表示选择,()表示限定
print(result)
if result:
list = result.group()
print(list,"是正常的邮箱地址")
else:
print(var, "不是正常的邮箱地址")
group函数表示取()中的内容那一部分。是分组函数
import re
while True:
var = input("输入你的邮箱地址:")
result = re.match(r"^([0-9a-zA-Z_]{4,20})@(163|126|q{2}|outlook)\.com$",var)
print(result)
if result:
list1 = result.group(1)
list = result.group()
list2 = result.group(2)
print(list,"是正常的邮箱地址")
print("第一部分内容是:",list1)
print("第二部分内容是:",list2)
else:
print(var, "不是正常的邮箱地址")
输入你的邮箱地址:261781wyw_@163.com
<re.Match object; span=(0, 18), match='261781wyw_@163.com'>
261781wyw_@163.com 是正常的邮箱地址
第一部分内容是: 261781wyw_
第二部分内容是: 163
注意:正则表达式中如果需要前后对应可以使用group函数要配对的用括号括起来后面用\1配对即可
import re
html_str ="<h1>hahxieu</h1>"
result = re.match(r"<(\w*)>.*</\1>",html_str)
list = result.group()
print(list)
限定符:
{n} 重复n次
{n,} 重复至少n次
{n,m} 重复n到m次
*重复至少0次
+ 至少重复一次
?重复0次或者1次
*?尽可能少得使用重复的第一个匹配
+? 尽可能少的使用重复但至少使用一次
?? 使用零次重复或者一次重复
{N}? 等同于{n}
{n,} ? 尽可能少地使用重复,但至少使用n次
{n,m}?介于n 次和m次之间,尽可能少的使用重复
Python中 re模块的高级用法:
Search:匹配出文章的阅读次数
import re
ret = re.search(r"\d+","阅读次数 9999")
print(ret.group())
9999
findall 统计出python,c,c++相应文章阅读的次数
ret1 = re.findall(r"\d+","python = 9999,c=9282, c++= 9282")
print(ret1)
['9999', '9282', '9282']
sub将返回的数据进行替换
re2 = re.sub(r"\d+","872","python =221, c= 2929")
print(re2)python =872, c= 872
split 根据匹配进行切割字符串,并返回一个列表
re3 = re.split(r":| ","information:I will come to you")
print(re3)['information', 'I', 'will', 'come', 'to', 'you']
常用字符转义:
\a 响铃
\b 在正则表达式中表示单词的边界
\t 制表符\u0009
\r 回车符\u000D
\v 垂直制表符
\f 换页符
\n 换行符
\e 回退(ESC)
\040 将ASCII 字符匹配为八进制数
\x20 使用16进制表示,形式与ASCII字符匹配
\cC ASCII控制字符