36.正则表达式

正则表达式

正则表达式,又称规则表达式(Regular Expression):

  • 是使用单个字符来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本
正则的三个基础方法

Python 正则表达式,使用re模块,并基于re模块中三个基础方法来做正则匹配

分别是:match、search、findall 三个基础方法

  • re.match(匹配规则,被匹配字符串)

从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空

s = 'python itheima python itheima python itheima'

result = re.match('python', s)

print(result) # <re.Match object; span=(0, 6), match='python'>

print(result.span()) # (0, 6)

print(result.group()) # python

s = '11python itheima python itheima python itheima'

result = re.match('python', s)

print(result) # None

import re
s = 'python itheima python itheima python itheima'
result = re.match('python', s)
print(result)  
# <re.Match object; span=(0, 6), match='python'>

print(result.span())  
# (0, 6)

print(result.group())  
# python

s = '11python itheima python itheima python itheima'

result = re.match('python', s)   # match从头部匹配,头部匹配不上后面不再理会

print(result) # None

(0, 6)
python
None
  • search(匹配规则,被匹配字符串)

搜索整个字符串,找出匹配的,从前向后,找到第一个后,就停止,不会继续向后

import re
s = '11python itheima python itheima python itheima'
result = re.search('python', s)
print(result)

result = re.search(' python', s)
print(result)

result = re.search('3python', s)
print(result)


None
  • findall(匹配规则,被匹配字符串)

匹配整个字符串,找出全部匹配项,找不到返回空list[]

import re
s = '11python itheima python itheima python itheima'

result = re.findall('python', s)
print(result)

result = re.findall('itheima', s)
print(result)

result = re.findall('haha', s)
print(result)
['python', 'python', 'python']
['itheima', 'itheima', 'itheima']
[]

元字符匹配

单字符匹配:

.  匹配任意1个字符(除了\n),. 匹配点字符本身

[]  匹配[]中列举的字符

\d  匹配数字,即0-9

\D  匹配非数字

\s  匹配空白,即空格、tab键

\S  匹配非空白

\w  匹配单词字符,即a-z、A-Z、0-9、_

\W  匹配非单词字符

示例:

字符串 s = 'itheima1 @@python2 !!666 ##itcast3'

  • 找出全部数字: re.findall(r'\d', s)

字符串的r标记,表示当前字符串是原始字符串,即内部的转义字符无效而是普通字符

  • 找出特殊字符:
  • 找出全部英文字母: re.findall(r'[a-zA-Z]', s)

[]内可以写:[a-zA-Z0-9]这三种范围组合或指定单个字符如[abcdABCD1234]

import re
s = 'itheima1 @@python2 !!666 ##itcast3'
result = re.findall(r'\d', s)
print(result)

result = re.findall(r'\W', s)
print(result)

result = re.findall(r'[a-zA-Z]', s)
print(result)

result = re.findall(r'[a-zA-Z0-9]', s)
print(result)
['1', '2', '6', '6', '6', '3']
[' ', '@', '@', ' ', '!', '!', ' ', '#', '#']
['i', 't', 'h', 'e', 'i', 'm', 'a', 'p', 'y', 't', 'h', 'o', 'n', 'i', 't', 'c', 'a', 's', 't']
['i', 't', 'h', 'e', 'i', 'm', 'a', '1', 'p', 'y', 't', 'h', 'o', 'n', '2', '6', '6', '6', 'i', 't', 'c', 'a', 's', 't', '3']

元字符匹配:

*  匹配前一个规则的字符出现0至无数次

+  匹配前一个规则的字符出现1至无数次

?  匹配前一个规则的字符出现0次或1次

{m}  匹配前一个规则的字符出现m次

{m,}  匹配前一个规则的字符出现最少m次

{m,n}  匹配前一个规则的字符出现m至n次

边界匹配:

^  匹配字符串开头

$  匹配字符串结尾

\b  匹配一个单词的边界

\B  匹配非单词边界

分组匹配:

|  匹配左右任意一个表达式

()  将括号中字符作为一个分组

# 匹配账号,只能由字母和数字组成,长度限制为6到10位。规则为:^[0-9a-zA-Z]{6,10}$
r = '^[0-9a-zA-Z]{6,10}$'
s = '24144jljdf'
print(re.findall(r, s))

# 匹配QQ号,要求纯数据,长度5-11,第一位不为0。规则为:^[1-9][0-9]{4,10}$
r = '^[1-9][0-9]{4,10}$'
s = '45366745242'
print(re.findall(r, s))

# 匹配邮箱地址,只允许QQ、163、gmail这三种邮箱地址。规则为:(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)
r = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'   # 加上r使规则内的\转义字符无效,作为普通字符串使用
s = 'wytd2342@gmail.com'
print(re.findall(r, s))
print(re.match(r, s).group())
['24144jljdf']
['45366745242']
[('wytd2342@gmail.com', '', 'gmail', '.com')]
wytd2342@gmail.com