正则表达式基础

Posted xwj-0408

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式基础相关的知识,希望对你有一定的参考价值。

正则表达式

正则表达式概述

#导入模块
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-\d8',"021-12345678").group()
res = re.match(r'021-?\dd8',"02112345678").group()
res = re.match(r'021-?\dd8',"021-12345678").group()

res = re.match(r'\d3-?\d8',"021-12345678").group()
res = re.match(r'\d3,4-?\d8',"0531-12345678").group()

res = re.match(r'\d3,4-?\d8',"0663-82992922").group()
res = re.match(r"\d3,4 -?\d7,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根据匹配进行切割字符串,并返回一个列表。

以上是关于正则表达式基础的主要内容,如果未能解决你的问题,请参考以下文章

[基础]正则表达式

正则表达式基础---转自 Python正则表达式指南 前边

python基础之正则表达式

python正则表达式---正则表达式基础

shell编程之正则表达式基础正则表达式

JS正则表达式基础认知