14.正则表达式

1.正则表达式的概念

正则表达式所面向的问题

1)判断一个字符串是否匹配给定的格式

       判断用户注册账号是否满足格式

2) 从字符串中按指定格式提取信息

      抓取页面中的链接

例:

1)判断邮箱格式是否正确

    使用r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$'

import re #导入re模块,稍后会讲

s1 = re.findall(r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$','[email protected]')
print(s1)  #返回列表['[email protected]']

s2 = re.findall(r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$','[email protected]')
print(s2)  #返回列表['[email protected]']

s3 = re.findall(r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$','10086qq.com')
print(s3)  #匹配失败 返回空列表[]

s4 = re.findall(r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$','[email protected]')
print(s4)  #匹配失败 返回空列表[]

2)抓取页面中特定的数据

import re

html ="""
<!DOCTYPE html>
<html>
  <body>
    <div>
      <a href="10086">
      <a href="10010">
    </div>      
  </body>
</html>
"""
a = re.findall(r'<a href="(.*?)">',html)
print(a)  #输出['10086', '10010']

2.re模块

      在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块来操作,名字为re

导入:import re

方法:

1)findall方法:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回                         空列表

import re

a = re.findall('python','i love python,python3 is  666')
print(a) #输出['python','python']

2)search方法:re.search 扫描整个字符串,匹配成功 返回的是一个匹配对象(这个对象包含了我们匹配的信息)

   注意:search只能匹配到从头开始的第一个,找到符合规则的就返回,不会一直往后找

import re

a = re.search('python','i love python,python3 is  666')
print(a) #输出<_sre.SRE_Match object; span=(7, 13), match='python'>
3)match方法:re.match 尝试从字符串的 起始位置匹配一个模式,匹配成功 返回的是一个匹配对象(这个对象                          包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的是空,

注意:match只能匹配到一个

  • 可以通过group()提取匹配到的内容
  • 可以通过span()提取匹配到的字符下标
import re

a = re.match('python','python3 is  666')
b = re.match('is','python3 is  666')
print(a) #<_sre.SRE_Match object; span=(0, 6), match='python'>
print(a.group(),a.span()) #python (0,6)
print(b) #None

3.元字符

   单字符匹配

字符 功能
                        .                         匹配任意一个字符(除了\n)
        []         匹配[ ]中列举的字符
    \d     匹配数字,即0-9
\D 匹配非数字
\s 匹配空白,即 空格,tab键
\S 匹配非空格
\w 匹配单词字符,即a-z,A-Z,0-9,_
\W 匹配非单词字符
 
import re #习惯性加'r',如下所示

a = re.findall(r'.','python3 is great') #['p', 'y', 't', 'h', 'o', 'n', '3', ' ', 'i', 's', ' ', 'g', 'r', 'e', 'a', 't']
b = re.findall(r'\d','python3 is great') #['3']
c = re.findall(r'\s','python3 is great') #[' ',' ']
d = re.findall(r'[a-z]','python3') #['p', 'y', 't', 'h', 'o', 'n']
e = re.findall(r'[a-z][0-9]','python3') #['n3'] (第一个字符是字母,第二个是数字

代表数量的元字符

字符 功能
* 匹配前一个字符出现0次或者n次
+ 匹配前一个字符出现1次或者n次
? 匹配前一个字符出现0次或1次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次

import re

a = re.findall(r'3*','python3') #['', '', '', '', '', '', '3', ''] 'p'不是'3',相当于0次
b = re.findall(r'3+','python3 is python3') #['3', '3']
c = re.findall(r'p?','python3') #['p', '', '', '', '', '', '', '']
d = re.findall(r'p{2}','ppython3 is perfect') #['pp']

表示边界的元字符

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
import re

a = re.findall(r'^py','python3') #['py']
b = re.findall(r'^py','12 py') #[]
c = re.findall(r'n3$','python3') #['n3']
d = re.findall(r'\bpy','python3 is good') #['py'] (单词以'py'为边界) 

分组匹配

字符 功能
| 匹配左右任意一个表达式(或运算)
(ab) 将括号中字符作为一个分组(整体)
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
import re
s = "[email protected]"
p = r"(\w{3,20})@(163|qq|gmail|126)\.(com)"  #括号内是一个整体
print(re.match(p,s).group()) #[email protected]
print(re.match(p,s).group(1)) #beiqiu
import re
s = '<html><h1>I love python</h1></html>'
p = r"<(?P<key1>.+)><(?P<key2>.+)>(.+)</(?P=key2)></(?P=key1)>" #重命名并引用
print(re.match(p,s).group('key1')) #html
print(re.match(p,s).group('key2')) #h1

4.贪婪和非贪婪

正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据

在非贪婪模式下,始终找最短匹配

import re
s1 = '<html><h1>I love python</h1></html>'
p1 = r"<.*>"
p2 = r"<.*?>"
print(re.match(p1,s1).group()) #<html><h1>I love python</h1></html>
print(re.match(p2,s1).group()) #<html>

s2 = '-123456789-'
p3 = r'-(\d+)(.+-)'
p4 = r'-(\d+?)(.+-)'
print(re.match(p3,s2).group(1),re.match(p3,s2).group(2)) #12345678 9-
print(re.match(p4,s2).group(1),re.match(p4,s2).group(2)) #1 23456789-
 

猜你喜欢

转载自blog.csdn.net/weixin_42089175/article/details/80626851