10-python之正则表达式

文章目录

  • 一、基本元字符
  • 二、re模块(结合正则使用)

一、基本元字符

一、常用基本元字符

.  匹配除换行符以外的任意字符 ,一次只能匹配一个字符
\w 匹配字母或数字或下划线, 比如:a3_
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
^  匹配字符串的开始
$  匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...]    匹配字符组中的字符, 比如[a-zA-Z0-9],只能匹配到1个字母或1个数字
[...]+   匹配字符组中的字符出现多次
[...]{m} 匹配字符组中的字符出现m次
[^...]   匹配除了字符组中字符的所有字符

2、常用量词(用来修饰前面一个单位出现的次数)

* 重复零次或更多次,前面可以有也可以没有都能匹配到
+ 重复一次或更多次,比如 [a-zA-Z0-9]+,允许某一段内容[alex123AD]出现一次或多次的字母和数字。
                  比如 [9]+,允许9出现一或多次
                  比如 [a-z]+,允许a-z出现一或多次
                  比如 [0-9]{3},允许0-9出现3次,例如: '435'
? 重复零次或一次,前面可以没有或者只能有一次
{n}   重复n次,比如9{3}表示匹配3个9,例如:'999',
{n,}  重复n次或更多次,比如9{3,}表示最少匹配3个9,或更多,例如:'999' '9999'
{n,m} 重复n到m次,比如9{2,4}表示匹配2-4个9, 例如:'99' '999' '9999'

3、常见组合用法

(1) 匹配'[email protected]'
思路:
    []+@[]+\.[]+
结果:
    [a-zA-Z0-9]+@[0-9]+\.[a-z]+
    [\w]+@[\d]+\.[\w]+
    
(2) 贪婪匹配,尽可能多的匹配
X.*Y: 从 "X" 开始匹配 -> 中间是任意内容 -> 一直匹配到最后一个(最远的那个) "Y"
匹配   111X111Y111YYY111YY111
结果是 X111Y111YYY111YY

<.*>:  从 "<" 开始匹配 -> 中间是任意内容 -> 一直匹配到最远的那个 ">"
匹配  
111232>22222>33333
111232>22222> (3) 惰性匹配(非贪婪匹配),尽可能少的匹配 X.*?Y: 从 "X" 开始匹配 -> 中间是任意内容 -> 一直匹配到最近的那个 "Y" 匹配 111X111Y111YYY111YY111 结果是 X111Y <.*?>: 从 "<" 开始匹配 -> 中间是任意内容 -> 一直匹配到最近的那个 ">" 匹配
111232>22222>33333
\d?Y: 不算惰性匹配, \d+?Y才算惰性匹配 (4) ^0a1.*z$ 匹配以0a1开头以z结尾的内容

二、re模块(结合正则使用)

一、re模块是python提供的处理正则表达式模块

1、findall 查找

# 查找字符串中的数字
import re
lst = 'alex age 23'
s = re.findall(r'\d+', lst)
s = re.findall(r'[0-9]+', lst)
print(s)
---------------------
['23']

10-python之正则表达式_第1张图片
2、search 匹配到第一个结果,就停止匹配

import re
lst = 'My naMe is alex,my age is 23,my phone is 13323234451'
# 匹配到第一个'M'就停止匹配,group()表示分组展示
s = re.search('M', lst).group()

# 匹配到第一个数字就停止匹配,‘\d’表示数字,r表示转义
import re
lst = 'alex age 23'
s = re.search(r'\d', lst).group()
s = re.search(r'[0-9]', lst).group()
print(s)
---------------------------------
2

3、match 只匹配以指定内容开头的部分

import re
lst = 'My naMe is alex,my age is 23,my phone is 13323234451'
# 匹配字符串开头的部分
s = re.match('My', lst).group()
print(s)
---------------------------------------
My

# 匹配数字开头的部分
import re
lst = '22 alex age 23'
s = re.match(r'\d+', lst).group()
print(s)
--------------------------
22

4、finditer 与 findall差不多,只不过返回的是迭代器

# 匹配数字
import re
lst = '22 alex age 23'
s = re.finditer(r'\d+', lst)   # s是迭代器
print(s.__next__().group())    # 通过.group()才能拿到数据
for i in s:
    print(i.group())       
---------------------------------------------
22
23

5、split 切割

(1) 将字符串以'is'进行分割
import re
lst = 'My naMe is alex,my age is 23,my phone is 13323234451'
s = re.split('is', lst)
print(s)
-------------------------------------
['My naMe ', ' alex,my age ', ' 23,my phone ', ' 13323234451']

(2) 将字符串以'a'和'c'进行分割
import re
lst = '13323a234c451'
s = re.split('[ac]', lst)
print(s)
---------------------------------------
['13323', '234', '451']

6、compile 将正则表达式匹配的内容定义成正则变量

(1) # 将正则表达式匹配的内容定义成正则变量,匹配规则是3个数字
import re
obj = re.compile(r'\d{3}',re.S)  # obj是一个写好的正则:代表匹配3个数字,r表示转义里面的"\", re.S运行换行匹配
s1 = obj.search('sdf23as444sss').group()  # 调用obj结合search()对字符串进行匹配
print(s1)
-------------------
444
# 也可以写成这样
obj = re.compile(r'\d{3}',,re.S).search('sdf23as444sss').group()
print(obj)
--------------------------------------------
444



(2) 匹配字符串中的'www.baidu.com'
lst = 'www.baidu.com, www.jd.com, www.taobao.com'    #被匹配的字符串
obj = re.compile(r'www\.baidu\.com',re.S)   # 定义正则:匹配'www.baidu.com'
s2 = obj.findall(lst)                       # 用定义好的正则去列表里面匹配
print(s2)
------------------------------------
['www.baidu.com']



(3) 只匹配括号里面的内容,通过findall()去拿数据
import re
lst = 'www.baidu.com,  www.jd.com'             # 被匹配的字符串
obj = re.compile(r'www\.(baidu|jd)\.com',re.S) #定义正则:匹配到'www.baidu.com'或'www.jd.com'后只拿括号内的
s2 = obj.findall(lst)                          # 用定义好的正则去目标中匹配内容
print(s2)
-------------------------------------
['baidu', 'jd']



(4) 只匹配括号里面的内容,通过finditer()分组去拿数据

import re
# 被匹配目标
lst = 'www.baidu.com, www.jd.com, www.taobao.com' # 

# 定义正则:匹配到'www.baidu.com'或'www.jd.com'后只拿括号里的内容,拿到内容后分组赋值给变量names
# 格式 (?P<变量名>匹配内容)
obj = re.compile(r'www\.(?Pbaidu|jd)\.com',re.S) 

# 用定义好的正则去目标中匹配(s2是迭代器)
s2 = obj.finditer(lst)         

# 通过for循环拿到迭代器里面的数据,并使用group('变量名')才能拿到数据
for i in s2:                                      
    print(i.group('names'))
--------------------------------------------
baidu
jd

7、sub 替换
格式:re.sub(‘替换前’, ‘替换后’, 对谁替换)

(1) 将字符串中的所有数字替换成 '**'
import re
lst = 'ab1c23de33fg23hi4jk'
s = re.sub(r'\d+','**', lst)
print(s)
-----------------------------------
ab**c**de**fg**hi**jk

(2) 将字符串中的所有'ab'转换成 'AB'
import re
lst = 'abcdefab'
s = re.sub('ab','AB', lst)
print(s)
---------------------------------
ABcdefAB

8、subn 替换并报告替换次数

# 将字符串中的所有数字替换成 '__',并报告替换次数
import re
lst = 'ab1cd2ef3ab'
s = re.subn(r'\d+','__', lst)
print(s)
-----------------------------------
('ab__cd__ef__ab', 3)

你可能感兴趣的:(python,python,正则表达式)