标签:高级 需求 re模块 content 文章 arc 空白 进一步 表达式
正则表达式概述
#导入模块
import re
#使用match方法进行匹配操作
res = re.match(正则表达式,要匹配的字符串)
res = re.match(r'hello',"hello world")
# <re.Match object; span=(0, 5), match='hello'>
# 如果进一步匹配数据,使用group方法来提取数据
res.group()
匹配单个字符
.匹配任意一个字符(除了\n)
[] 匹配[]中列举的字符
\d 匹配数字,即0~9
\D 匹配非数字,即不是数字
\s 匹配空白,即空格 tab键 # 很少用
\S 匹配非空白
\w 匹配单词字符,即a~z A~Z 0~9 _
\W 匹配非单词字符
import re
res = re.match(r'hello',"hello world")
res = re.match(r'[hH]ello',"hello world")
res = re.match(r"速度与激情[1234567]",'速度与激情')
res = re.match(r'速度与激情/d',"速度与激情7").group()
res = re.match(r"速度与激情[1-8]",'速度与激情7').group()
res = re.match(r'速度与激情[1-35-6]',"速度与激情4").group() #[1-35-6] 表示列举12356
res = re.match(r'速度与激情[1-8abcd]',"速度与激情b").group() #[1-8abcd]表示列举12345678abcd
res = re.match(r'速度与激情[1-8a-zA-Z]',"速度与激情F").group()
res = re.match(r'速度与激情\w',"速度与激情_").group() #/w慎用
res = re.match(r'速度与激情 \d',"速度与激情 1").group()
res = re.match(r'速度与激情.',"速度与激情1").group()
res = re.match(r'速度与激情.',"速度与激情w").group()
res = re.match(r'速度与激情.',"速度与激情哈").group()
匹配多个字符
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
?匹配前一个字符出现1次或者0次,即要么没有有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n}匹配前一个字符出现从m到n次(包括m和n)
res = re.match(r'021-\d{8}',"021-12345678").group()
res = re.match(r'021-?\dd{8}',"02112345678").group()
res = re.match(r'021-?\dd{8}',"021-12345678").group()
res = re.match(r'\d{3}-?\d{8}',"021-12345678").group()
res = re.match(r'\d{3,4}-?\d{8}',"0531-12345678").group()
res = re.match(r'\d{3,4}-?\d{8}',"0663-82992922").group()
res = re.match(r"\d{3,4} -?\d{7,8}","0663-8292922").group()
html_content = """u1ior
jooooooooooooooooosksj
jy202e0u
hidhdje9e9
hu90020ue
"""
res = re.match(r'.*',html_content,re.S)
"""匹配变量名是否有效"""
import re
names = ["name_1","_name","2__name","__name__"]
for name in names:
res = re.match(r'^[a-zA-Z_]+[\w]*$',name)
if res:
print(f"变量名{res.group()}符合要求")
else:
print(f"变量名{name}不符合要求")
匹配开头结尾
^ 匹配字符串开头
$ 匹配字符串结尾
匹配出163的邮箱地址,且@符合之前有4到20位,例如hello@163.com
import re
def main():
email = input("请输入一个邮箱地址:")
#如果在正则表达式中需要用到了某些普通的字符。比如. 比如?等
# 仅仅需要在他们前面添加一个 反斜杠进行转义
ret = re.match(r'^[a-zA-Z1-9]{4,20}@163\.com$',email)
if ret:
print(f"{email}符合要求")
else:
print(f'{email}不符合要求')
if __name__ == "__main__":
main()
匹配分组
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P = name) 引用别名为name分组匹配到的字符串
res = re.match(r'^[a-zA-Z0-9_]{4,20}@(163|126)\.com$',"laowang@163.com").group()
res = laowang@163.com
html_str = "<h1>hahahaha</h1>"
res = re.match(r'<(\w*)>.*</\w*>',html_str).group()
res = re.match(r'<(\w*)>.*</\1>',html_str).group()
html_str = "<body><h1>hahaha</h1></body>"
res = re.match(r'<(\w*)><(\w*)>.*</\2></\1>',html_str).group() #当很少的时候,采用
res = re.match(r'<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>',html_str).group()
re模块的高级用法
search # 不会从头匹配
match # 从头开始匹配
# 需求:匹配出文章阅读的次数
import re
res = re.search(r'\d+',"阅读的次数").group()
import re
res = re.findall(r'\d+',"python =999,c = 7890,c++ = 12345")
import re
res = re.findall(r'\d+'," python = 999,c = 7890,c++ = 12345 ")
# ['999', '7890', '12345']
sub # 将匹配到的数据进行替换
res = re.sub(r'\d+','998','python = 221') #替换 将221 替换成998
split根据匹配进行切割字符串,并返回一个列表。
标签:高级 需求 re模块 content 文章 arc 空白 进一步 表达式
原文地址:https://www.cnblogs.com/xwj-0408/p/11439406.html