简识正则表达式

 什么是正则表达式?用一个规则去匹配你想要的的信息。

正则表达式:使用来处理文本的,将一组类似的字符串进行抽象,形成的文本模式字符串。

  match:检测字符串是否匹配正则表达式

  search:在一个长的字符串中搜索匹配正则表达式的子字符串

  findall:查找字符串

  sub和subn:搜索和替换

  split:通过正则表达式指定分隔符,通过这个分隔符将字符串拆分

元字符:特殊符号和字符,正是它给予正则表示枪的功能和灵活性。

 

__author__ = 'Administrator'
import re
res1=re.match(r"爱情公寓1","爱情公寓1")
print(res1.group())

#  报错
# res2=re.match(r"爱情公寓1","爱情公寓2")
# res2.group()

res3=re.match(r"爱情公寓\d","爱情公寓9")
print(res3.group())

res4=re.match(r"爱情公寓\d","爱情公寓88888888885")
print(res4.group())

res5=re.match(r"爱情公寓[123456789]","爱情公寓7")
print(res5.group())

res6=re.match(r"爱情公寓[1-9]","爱情公寓6")
print(res6.group())

res7=re.match(r"爱情公寓[1234789]","爱情公寓3")
print(res7.group())

res8=re.match(r"爱情公寓[1-347-9]","爱情公寓3")
print(res8.group())

res9=re.match(r"[hH]ello","hello,world")
print(res9.group())

res10=re.match(r"[hH]ello","Hello,world")
print(res10.group())

res10=re.match(r"[hH]ello","Hello,world")

res11=re.match(r"爱情公寓[1-9a-z]","爱情公寓z")
print(res11.group())


res11=re.match(r"爱情公寓[1-9a-zA-Z]","爱情公寓B")
print(res11.group())

res12=re.match(r"爱情公寓\w","爱情公寓a")
print(res12.group())

res12=re.match(r"爱情公寓\w","爱情公寓C")
print(res12.group())

res13=re.match(r"爱情公寓\s\d","爱情公寓\t8")
print(res13.group())

#  .相当于Linux里面的*,一个.匹配任意一个字符
res14=re.match(r"爱情公寓.","爱情公寓哈哈哈")
print(res14.group())

res15=re.match(r"爱情公寓.","爱情公寓AZ89")
print(res15.group())

#####################################
爱情公寓1
爱情公寓9
爱情公寓8
爱情公寓7
爱情公寓6
爱情公寓3
爱情公寓3
hello
Hello
爱情公寓z
爱情公寓B
爱情公寓a
爱情公寓C
爱情公寓    8
爱情公寓哈
爱情公寓A
View Code

 限定符:

 

 

__author__ = 'Administrator'
import re

res1=re.match(r"爱情公寓\d\d","爱情公寓111")
print("1."+res1.group())

#  报错
# res2=re.match(r"爱情公寓\d\d","爱情公寓1")
# print(res2.group())

res3=re.match(r"爱情公寓\d{1,2}","爱情公寓1")
print("3."+res3.group())

res4=re.match(r"爱情公寓\d{1,2}","爱情公寓2")
print("4."+res4.group())

res5=re.match(r"爱情公寓\d{1,2}","爱情公寓12")
print("5."+res5.group())

res6=re.match(r"爱情公寓\d{1,3}","爱情公寓12")
print("6."+res6.group())

res7=re.match(r"爱情公寓\d{1,3}","爱情公寓1234")
print("7."+res7.group())

res8=re.match(r"爱情公寓\d{1,3}","爱情公寓12")
print("8."+res8.group())

res9=re.match(r"\d{11}","12345678901").group()
print("9."+res9)

#  报错
# res10=re.match(r"\d{11}","1234567890").group()
# print("10."+res10)

#  报错
# res11=re.match(r"\d{11}","1234567890A").group()
# print("11."+res11)

res12=re.match(r"021-\d{8}","021-12345678").group()
print("12."+res12)

res13=re.match(r"021-?\d{8}","021-12345678").group()
print("13."+res13)

res14=re.match(r"021-?\d{8}","021-12345678").group()
print("14."+res14)

res15=re.match(r"\d{2,4}-?\d{7,8}","021-12345678").group()
print("15."+res15)

##########################
1.爱情公寓11
3.爱情公寓1
4.爱情公寓2
5.爱情公寓12
6.爱情公寓12
7.爱情公寓123
8.爱情公寓12
9.12345678901
12.021-12345678
13.021-12345678
14.021-12345678
15.021-12345678
View Code 
__author__ = 'Administrator'
import re

def main():
    names=["age","_age","name","1name","!age"]
    for name in names:
        res=re.match(r"[a-zA-Z_][a-zA-Z0-9_]*$",name)
        if res:
            print("变量名:%s 符合要求,匹配出来的是:%s" %(name,res.group()))
        else:
            print("变量名:%s 不符合要求" %(name))

if __name__ == '__main__':
    main()


#######################
变量名:age 符合要求,匹配出来的是:age
变量名:_age 符合要求,匹配出来的是:_age
变量名:name 符合要求,匹配出来的是:name
变量名:1name 不符合要求
变量名:!age 不符合要求
View Code
import re

#  6到8个字符,可使用字母、数字、下划线,需以字母开头,@163.com、@126.com,@yeah.com
def main():
    while True:
        emails=input("请输入邮箱地址:")

        res=re.match(r"[A-Za-z]\w{5,7}@(163|126|yeah)\.com$",emails)
        if res:
            print("%s是符合规定的,匹配出来的是:%s" %(emails,res.group()))
        else:
            print("不合法")

if __name__ == '__main__':
    main()


############################
请输入邮箱地址:ZCQPCY1@163.com
ZCQPCY1@163.com是符合规定的,匹配出来的是:ZCQPCY1@163.com
请输入邮箱地址:
View Code

 

html_str6 = "<body><h1>hahahah</h1></body>"
ret8=re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_str6)
print(ret8.group(1))
print(ret8.group(2))


############################

body
h1
View Code

 

    【注意】要显示匹配一个句点或者句号本身,必须使用反斜线转义句点符号的功能,例如:"\.",匹配\A——A;

      如果是想要逐字匹配字符字符中的任一一个或者是全部,就必须使用反斜线进行转义;

      

    \b和\B匹配字符边界:

 

      \b匹配一个单词的边界;

 

      \B搜索出现在一个单词中间的模式

__author__ = 'Administrator'
import re

ret=re.search(r"^the","the world")
print(ret.group())
#  匹配任何以the开始的字符串
ret1=re.match(r"\bthe","the world")
print(ret1.group())
#
ret2=re.search(r"the\b"," man the i love ")
print(ret2.group())

ret3=re.search(r"\Bthe","ilovetheworld")
print(ret3.group())

ret4=re.search(r"the","ilovetheworld")
print(ret4.group())

ret5=re.search(r"world$","ilovetheworld")
print(ret5.group())


###############################

the
the
the
the
the
world
View Code

 

html_str1 = "<h1>hahahah</h1>"
ret1=re.match(r"<\w*>.*</\w*>", html_str1)
print(ret1.group())

ret2=re.match(r"<\w*>.*</\w*>", html_str1)
print(ret2.group())

html_str2 = "<h1>hahahah</h2>"
ret3=re.match(r"<\w*>.*</\w*>", html_str2)
print(ret3.group())
try:
    ret4=re.match(r"<(\w*)>.*</\1>", html_str2)
    print(ret4.group())
except:
     print("我是ret4:我有点点问题,快来拯救我")

html_str3 = "<h1>hahahah</h1>"
ret5=re.match(r"<(\w*)>.*</\1>", html_str3)
print("我是ret5:"+ret5.group())

html_str6 = "<body><h1>hahahah</h1></body>"
try:
    ret6=re.match(r"<(\w*)><(\w*)>.*</\1></\2>", html_str6)
    print(ret6.group())
except:
    print("我是ret6:我有点点问题,快来拯救我")

ret7=re.match(r"<(\w*)><(\w*)>.*</\2></\1>", html_str6)
print(ret7.group())

ret8=re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_str6)
print(ret8.group())

html_str7= "<body><h1>hahahah</body></h1>"
ret9=re.match(r"<(\w*)><(\w*)>.*<(/\1)></\2>",html_str7)
print(ret9.group())


########################
<h1>hahahah</h1>
<h1>hahahah</h1>
<h1>hahahah</h2>
我是ret4:我有点点问题,快来拯救我
我是ret5:<h1>hahahah</h1>
我是ret6:我有点点问题,快来拯救我
<body><h1>hahahah</h1></body>
<body><h1>hahahah</h1></body>
<body><h1>hahahah</body></h1>
View Code

 

 

 

 

搜索

  search、findall、sub

    search和match:

    search是在给指定的字符串当中去搜索符合的正则表达式的内容;

    match就是从左到右的完整的去匹配,多出来的不报错,少了则报错;

    但是两者的语法都一样,re(r"正则表达式","指定的字符串")。

    比如在一篇微信公众号文章中中,匹配阅读人数:

      res=re.search(r"\d+","阅读人数:1289")

  findall

    比如查找多个数字:

      res=re.findall(r"\d+","文章有12893647个字,阅读人数为3657,章节为120")

      print(res)

      ["12893647","3657","120"]

      findall返回的帝乡是list类型的,支持list的所有操作,如果没有找到匹配的部分,就返回一个空列表。

  sub

    将匹配到的数据进行替换;

    re.sub(pattern,replacement,"string")

    pattern——正则表达式

    replacement——替换成什么(可以是字符串,也可以是函数,函数返回的一个用来替换的字符串

    string——要被替换的字符串

    比如把python开发工程师的工资换成20000;

      res=re.sub(r"\d+","20000","python_salary=15000")

import re

def replace(res):
    result=int(res.group())+5000
    return str(result)

res=re.sub(r"\d+",replace,"python_salary=15000")
print(res)

#########################
python_salary=20000
View Code

 

  split 根据匹配进行切割字符串,并返回一个列表 

 

posted @ 2019-05-31 23:46  小猪猪猪  阅读(138)  评论(0)    收藏  举报