Python 正则表达式练习

import re

re.search(r"00\d","007") #\d可以匹配数字
re.search(r"\d\d\d","123")
re.search(r"\w\w\d","bs4") #\w可以匹配字母
re.search(r"\w\w.","bs!") #.可以匹配任意字符
re.search(r"\w+","aaaaaaahhhhhhhvvvvvv") #+表示至少匹配一个字符
re.search(r"\w?","aaaaaaahhhhhhhvvvvvv") #?表示匹配0个或者1个字符
re.search(r"\w*","aaaaaaahhhhhhhvvvvvv") #*表示匹配任意个字符(包括0个)
re.search(r"\w{3,5}","aaaaaaahhhhhhhvvvvvv") #{3,5}表示匹配3-5个字符
re.search(r"\w{3}","aaaaaaahhhhhhhvvvvvv") #{3}表示匹配3个字符
re.search(r"\d{3}\s\-\s\d{8}","021 - 12345678") #匹配带有空格的电话号码格式,\s表示匹配空格,\-表示将中间特殊的横杠转义
re.search(r"[0-9a-zA-Z\_]{0,20}\@hotmail\.com|[0-9a-zA-Z\_]{0,20}\@qq\.com","123456@hotmail.com") #匹配hotmail或者QQ的邮箱地址
re.search(r"^\d*\w*","021ABC") #^在\d之前表示匹配的字符串首位必须是数字
re.search(r"\d*\w*$","021ABC") #$在\w*之后表示匹配的字符串末位必须是数字
re.search(r"^\d{3}\-\d{3,8}$","010-12345")

re.match(r"^\d{3}\-\d{3,8}$", "010-12345") #match方法判断是否能匹配成功,如果匹配成功会返回一个match对象,如果没有,则返回none
str = "It is Sunday"
re.match(r"It",str)
re.match(r"is",str)
re.match(r"sunday",str)
re.search(r"sunday",str)
re.search(r"Sunday",str)
#re.match() 从第一个字符开始找, 如果第一个字符就不匹配就返回None, 不继续匹配. 用于判断字符串开头或整个字符串是否匹配,速度快.
#re.search() 会整个字符串查找,直到找到一个匹配。

password = input("Please input your password")
if re.match(r"123",password):
    print("Your password is right")
else:
    print("Your password is wrong")

re.split(r"[\s\,\;\-\+]","a b c; ;d-7,a,8,d dfghs") #尝试用正则表达式来划分字符串
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') #()用于分组,当match返回一个对象给m时,可以用group方法提取第0组(整个正则表达式相匹配的字符串)、第1组第2组等表示第1、第2个自串
m.group(0)
m.group(1)
m.group(2)

import datetime as dt
ISOTIMEFORMAT = '%H:%M:%S'
Time = dt.datetime.now().strftime(ISOTIMEFORMAT)
print(Time) #获取系统当前时间
SplitTime = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', Time)
SplitTime.groups() #把系统时间split成小时、分钟、秒

re.match(r'^(\d+)(0*)$', '102300').groups() #\d+贪婪匹配
re.match(r'^(\d+?)(0*)$', '102300').groups() #\d+?非贪婪匹配,特殊字符串后面加?为非贪婪模式

re_telephone = re.compile(r"^(\d{3}-(\d{3,8})$)")
re_telephone.match('010-12345').groups() #先将正则表达式编译后再使用match方法

import re
def is_valid_email(addr):
    re_addr = re.compile(r"([a-zA-z]*\d*\.*\-*\_*)\@(\w*)(\.com)")
    if re_addr.match(addr) != "":
        print("This is a right addr")
    else:
        print("This is not a right addr")
    return True
        
is_valid_email("bill.gates@microsoft.com") #判断一个邮箱的格式是否正确

import re
def split_email(addr):
    while addr:
        re_addr = re.compile(r"([a-zA-z]*\d*\.*\-*\_*)\@(\w*)(\.com)")
        if re_addr.match(addr) != "":
            sp_addr = re.split(r"\@",addr)
            print(addr+" ==> "+sp_addr[0])
            break
        else:
            addr = str(print("Please tell me a mail address"))
            continue
    
split_email("tom@voyager.com") #拆分邮箱

import re
content = "It's 12345.pm o'clock, it's time to have a lunch!"
result = re.match(r".*?(\d+).*",content) #这里的第一个.*必须加?启动非贪婪模式,否则贪婪模式会匹配所有的字符串只留下1个数字作为返回结果
if result:
    print(result.group(1))

import re
content = '''It's 12345.pm o'clock, 
it's time to have a lunch!'''
result = re.match(r".*?(\d+).*",content,flags = re.S) #flags = re.S表示可以换行匹配,flags = re.I表示可以忽略大小
if result:
    print(result.group(1))

import re

# 取出html中的歌手名和歌名
html = '''<div id="songs-list">
    <h2 class="title">经典老歌</h2>
    <p class="introduction">
        经典老歌列表
    </p>
    <ul id="list" class="list-group">
        <li data-view="2">一路上有你</li>
        <li data-view="7">
            <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
        </li>
        <li data-view="4" class="active">
            <a href="/3.mp3" singer="齐秦">往事随风</a>
        </li>
        <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
        <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
        <li data-view="5">
            <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
        </li>
    </ul>
</div>'''

result = re.findall('<a.*?singer="(.*?)">(.*?)</a>', html,flags = re.S)
if result:
    print(result) #使用findall方法返回的是列表,而且可以找到所有的对应项,用search的话只能匹配首次发现的项,用match的话只要html的首字符不符合就返回none
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值