码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式基础

时间:2019-08-31 17:26:14      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:高级   需求   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!