Python 正则表达式-基础操作

  • search()方法:只要有匹配的后面就不会继续进行检索,找到一个匹配就会停止。
msg = ‘abcd7vikfd8hdfoo’

result = re.search([a-z][0-9][a-z], msg)  # 正则表达式中的字符串都是当做一个整体的,即[a-z][0-9][a-z]需当做一个整体,匹配字符串中“英文-数字-英文”的格式。
print(result.group()) # group()方法:得到匹配到的结果。search方法的返回值不是一个字符串

# 输出结果:d7y
  • findall()方法:匹配整个字符串,找到一个继续向下找一直到字符串结尾。
msg = ‘abcd7vikfd8hdfoo’

re.findall('[a-z][0-9][a-z]', msg) 
print(result.group())

# 输出结果:['d7v', 'd8h']
  • '+':用于将前面的模式匹配1次或多次(贪婪模式)。即如果放在某模式的后面,则该模式在要匹配的字符串中有多少就匹配多少
msg = 'a789bb333cdef9q'

result = re.findall('[a-z][0-9]+[a-z]', msg) # ’+‘放在了模式[0-9]后面,则该字符串中的该模式,有多少匹配多少
print(result)

# 输出结果:['a789b','b333c','f9q']
  • {m}:匹配前一个字符m次;{m,}:匹配前一个字符>=m次;{m,n}:匹配前一个字符m-n次,即只要前一个字符类型的个数在m-n之内,就匹配。
# qq号码验证:5-11位,开头不能是0
qq = 12798982

result = re.match('[1-9][0-9]{4,10}','qq') # [1-9]表示第一位字符必须不能为0,[0-9]{4-10}表示,[0-9]这个模式的的字符数量在4-10个之内都可以被匹配
print(result.group())

# 输出结果:12798982

- '^':从字符串开头开始匹配;
- '$':匹配至字符串结尾

qq1 = 1871056336666
qq2 = 20150602

result1 = re.match('^[1-9][0-9]{4,10}$') # 因为match方法其实就是从开头匹配的,所以如果在match方法内,也可以不用^
result2 = re,match('^[1-9][0-9]{4,10}$')

print(result1)
print(result2.group())

"""
输出结果:
result1:None。匹配到该字符串尾,该字符串大于11位,所以返回为None
result2:20150602。匹配到该字符串结尾,该第一位是2,在1-9之内,后面的7个数字,在{4-10}之内,且都在[0-9]之内,所以可以匹配成功
"""
  • '\w':匹配任意字母数字及下划线,等价于[a-zA-Z0-9_];\W:匹配任意非字母数字及下划线,等价于[^\w];^在正则表达式里面是非的意思
 username = 'admin001'
 result = re.search([a-z][A-Z]\w{5,}$) # 其实\w相当于[a-zA-Z0-9_] $表示匹配到边界
 print(result)
 
 # 输出:
 ['admin001']
  • '\b':匹配一个单词边界,也就是指单词和空格间的位置。例如:'py\b'可以匹配"python"中的’py’,但不能匹配openpyxl中的‘py’
# 要求匹配.py文件
msg = 'aa.py ab.txt bb.py kk.png uu.py apyb.txt'
result = re.findall('py\b', msg) # 因为在字符串中'\b'也有含义,所以在正则表达式里这样写肯定匹配的意思不是匹配边界的意思
print(result)

# 输出:
[]
  • 1、优化1:在\b前再加一个\将\b的转义意思去掉
msg = 'aa.py ab.txt bb.py kk.png uu.py apyb.txt'
result = re.findall('py\\b', msg) # 需要加一个\将字符串中的\b转义为正常字符
print(result)

# 输出:
['py', 'py', 'py']
  • 2、优化2:直接在正则表达式前面加r,去掉表达式字符中所有的转义字符
msg = 'aa.py ab.txt bb.py kk.png uu.py apyb.txt'
result = re.findall(r'py\b', msg)
print(result)

# 输出:
['py', 'py', 'py']
  • '.':匹配除换行符\n外的任意字符

栗子:已知一串文件名,匹配后缀为.py的文件名

msg = 'aa.py ab.txt bb.py kk.png uu.py apyb.txt'
# \w代表任意字母数字或下划线
# +代表匹多次且必须一次以上,即>=1(所以此处不能用*,*是匹配0次或多次即>=0,即0次也能匹配,即没有字母也能匹配,匹配到的是.py)
# '.'字符在正则里面是匹配除换行符\n之外的任意字符,它可以匹配'.'字符,但也能匹配其他全部字符,所以在正则的字符串中要用'.'的本来含义,必须通过\进行转义,使他在正则表达式中仅仅只是匹配'.'。
# \b是指匹配到字符串边界
result = re.findall(r'\w+\.py\b', msg) 
print(result)

# 输出;
['bb.py', 'bb.py', 'uu.py']
  • '?':量词:表示匹配0次或1次。
# 匹配数字 0-100数字
n = '09'
result = re.match('[1-9]?\d', n) # 第一个字符[1-9]?,即表示出现1-9其中一个字符0次或1次都是可以匹配到的。
print(result)

# 输出: 
['0']
# 因为第一个字符0没有在[1-9]之内,即出现了0次,所以依次往后匹配。第二个字符\d就匹配到了字符串n的第一个字符'0',所以最后输出为0
  • '|':指在两个或多个项之间进行选择。相当于或。
# 验证输入的邮箱 163 126 qq
email = '1783787843@qq.com'
# (163|126|qq):匹配163或者126或者qq
# (com|cn):匹配com或者cn
result = re.match(r'\w{5,20}@(163|126|qq)\.(com|cn)', email)
print(result)
# 输出:1783787843@qq.com
  • (word | word | word):小括号括起来是指单词整体。eg:(163|126|qq):匹配163或者126或者qq
  • [word | word | word]:中括号括起来的是指一个字符而不是一个单词。eg:(163|126|qq):匹配163中的一个字符或者126中的一个字符或者qq中的一个字符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值