python正则表达式

正则表达式

一、概述

1. 正则表达式,也称为规则表达式,(英文:Regular Expression,简称:regex或re)Python中的模块import re

2. 正则表达式通常用来检索、判断、替换那些符合某个规则(模式)的字符串

3. 正则表达式并不是Python独有的

4. 正则表达式是对字符串【普通字符串:a-z A-Z】和特殊字符【称为'元字符'】进行操作的一种逻辑公式(式子)

二、re模块

import re # 导入re模块
re.findall(正则表达式,待检索的字符串)  
# 正则表达式可以是 普通字符串 也可以是 元字符串
# 返回一个列表,元素是符合要求的字符串
import re

regex = 'abc'
string = 'abc3251dabceqadfabcew52'

result = re.findall(regex,string)
print(result)

三、元字符

上述示例只能查找普通字符串,如果想查询包含某种规则的字符串,就需要使用到元字符.re.findall('abc\d+d$','abc12423d')

1. [] 表示一个字符集或字符范围
		- [xyz] 表示查找x或y或z的字符
		- [a-z] 表示 a-z范围内的所有字符
		- [0-9] 表示 0-9 字符
		- [^a-z] 不包含a-z的字符
# 示例
# 查找所有的x和y及z的字符
print(re.findall('[xyz]','2905rt30sazyassadfxsdfy'))
# 查找fx、fy、fz的字符
print(re.findall('f[xyz]','2905rt30sazyassadfxsdfy'))

2. ^
	    匹配行首 ^abc  表示是以abc开头的
3. $
		匹配行尾 d$ 表示以d结尾的
# 在集成环境Pycharm中Django框架 url文件中可以有 url('^index/$')
print(re.findall('a','aadsfasdfasdfadsa')) # 找到所有的a
print(re.findall('^a','aadsfasdfasdfadsa')) # 行首的a
print(re.findall('a$','aadsfasdfasdfadsa')) # 行尾的a

4. \ (反斜杠)
	反斜杠后面加不同的字符,表示不同的特殊含义
		\d 匹配任何的十进制的数 等价于[0-9]
		\D 匹配任何的非十进制的数 等价于[^0-9]
		\s 匹配任何的空白字符 \t \n \r
		\S 同上取反
		\w 匹配任何的字母、数字、下划线 [a-zA-Z0-9_]
		\W 同上取反
		\ 可以转义 用于取消元字符变成普通字符
print(re.findall('\d','aa1414dsfa  _ sd\tfas\ndfadsa'))

5. {n}  匹配n次  \d{3}
   {n,}  至少匹配n次
   {n,m} 匹配n到m次
print(re.findall('\d{4}','aa1414dsfa  _ sd\tf2354as\ndf12adsa'))
print(re.findall('\d{2,4}','aa1414dsfa  _ sd\tf2354as\ndf12adsa'))

6. *
		指定一个字符可以匹配零次或多次
print(re.findall('a[1-9]*','adafa141adsfdfd')) 
# ->  ['a', 'a', 'a141', 'a']

7. +
	    匹配一次或多次
print(re.findall('a[1-9]+','adafa141adsfdfd')) # ->  ['a141']

8. ?
	    匹配一次或零次
print(re.findall('a[1-9]?','adafa141adsfdfd'))
# -> ['a', 'a', 'a1', 'a']

9. .
	   匹配除\n和\r之外的任意的单个字符 
print(re.findall('.+','adafa141a\ndsfdfd'))

# +或*是贪婪模式
print(re.findall('a[0-9]+','adafa141adsfdfd'))
# ?是非贪婪模式
print(re.findall('a[0-9]?','adafa141adsfdfd'))

四、正则函数

1、re.match()函数
# match(pattern, string, flags=0)
     尝试从字符串的起始位置匹配一个模式(规则),如果匹配不成功返回为None
print(re.match('baizhi','baizhiPython'))  # 返回match对象
print(re.match('\w{3}baizhi','abcbaizhiPython'))# 返回match对象
print(re.match('010-[0-9]{6}','010-123456'))# 返回match对象
print(re.match('010-[0-9]{6}','010-1234567'))# 返回match对象
print(re.match('^010-[0-9]{6}$','010-1234567'))# 返回None
2、re.search()函数
# search(pattern, string, flags=0)
	扫描整个字符串并返回第一个成功的匹配
print(re.search('abc','abaadfabcasdfaabc'))
3、re.findall()函数
# findall(pattern, string, flags=0)
     查找所有匹配的字符串,返回一个列表
4、re.finditer()函数
# finditer(pattern, string, flags=0)
	和findall类似,查找所有匹配的字符串,返回值为一个迭代器
for i in re.finditer('abc','abaadfabcasdfaabc'):
    print(i)  # 每一个元素是一个Match的对象
5、re.split()函数
# split(pattern, string, maxsplit=0, flags=0)
	split方法按照规则将字符串分割后返回列表
print(re.split(';','adsfa;adsasdf;adsf a; adsfa'))
print('adsfa;adsasdf;adsf a; adsfa'.split(';'))

print(re.split('[;,]','adsfa;ads,asd,f;ad,sf a; adsfa'))
print(re.split('[;,\s]','ad sfa;ads,as\nd,f;ad,sf a; adsfa'))
6、re.sub()函数
# sub(pattern, repl, string, count=0, flags=0)
     用于替换字符串的匹配项
number = '010-123456-86# 这是一个固定电话'
print(re.findall('#.*$', number))
print(re.sub('#.*$', '', number)) # 查找并替换

print(''.join(re.findall('\d',number)))
print(re.sub('\D','',number))
  • match对象
    1. span() 
    		返回一个元组 (开始,结束)位置
    2. start()
    		匹配的字符串的开始位置 
    3. end()
    		匹配的字符串的结束位置
    4. group()
    		匹配的字符串
    
    print(re.search('abc\w+', 'abaadfabcasdfaabc').group())
    print(re.finditer('abc\w?', 'abaadfabcasdfaabc'))
    
    for i in re.finditer('abc\w?', 'abaadfabcasdfaabc'):
        print(i.group())
    

五、分组

email1 = 'hello@163.com'
email2 = 'hello@qq.com'
email3 = 'he_llo@126.com'

print(re.findall('^([a-zA-Z0-9]{1,})@(163|126|qq)\.(com|cn|org)',email1))  # \1 \2 \3对应每一个捕获组
print(re.findall('<a>(.*)</a>','<div><a>www.baidu.com</a></div>'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值