正则表达式

re模块 正则表达式

作用:

	1) 过滤数据 
	2) 数据验证

一、正则表达式元字符:

1、匹配单个字符

.	[art]	[a-z]	[a-zA-Z]	[0-9]	[^0-9]

\d 	任意单个数字
	\D  
	
\w 	任意单个字符 
	\W 
	
\s 	任意单个空白字符  
	\S 

2、匹配字符出现的次数

* 	任意次 
+	至少一次
?	最多一次
{3}	精确3次
	{3,}
	{3,5}
	
?的含义:
	1) 次数   ab?			
	2) ?跟在一个表示次数的字符后面, 非贪婪模式匹配
		
		贪婪模式:
			最长匹配
		非贪婪模式 
			最短匹配

3、匹配字符出现的位置

^string 
string$

\bstring\b 	匹配string是不是单词

二、匹配数据

1、search()

扫描整个字符串,搜索符合正则表达式的数据; 

如果可以匹配数据,返回Match object对象, 否则返回None

import re

test = "python regex demo example"
test_re = r"d..o"

result = re.search(test_re, test)

print(result)
print(result.group())			// group()用于输出匹配的数据 


test = "python regex demo like"
test_re = r"\d"

result = re.search(test_re, test)
if result:
	print("匹配到的数据: %s" % result.group())
else:
	print("无匹配的数据!!!")

2、match()

从字符串开头匹配数据,如果可以匹配返回Match Object, 否则返回None

import re

test = "python regex demo example"

test_re = r"d..o"

result = re.match(test_re, test)
print(result)

三、匹配对象返回数据的方式

group()
	以字符串返回匹配的数据 
	
groups()
	以元组返回匹配的数据 
	
groupdict()
	以字典返回匹配的数据 

1、groups()

返回元组, 元组中保存正则表达式中分组的数据 

import re

test = '10.0.45.209 - - [09/Jan/2019:12:19:42 +0800]'

test_re = r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s\S\s\S\s\[(.*?)\]"

result = re.search(test_re, test)

if result:
	data = result.groups()
	print(data)
	print("客户端IP地址:%s" % data[0])
	print("客户端访问时间:%s" % data[1])

2、groupdict()

以字典返回匹配的数据

{ "分组名称": "分组匹配的数据" }

a) 正则中存在分组
b) 为分组命名    (?P<组名>....)

import re

test = '10.0.45.209 - - [09/Jan/2019:12:19:42 +0800]'

test_re = r"(?P<客户端地址>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s\S\s\S\s\[(?P<访问时间>.*?)\]"

result = re.search(test_re, test)

if result:
	print(result.groupdict())

四、其他的方法

1、findall()

以列表的形式返回匹配的所有数据

import re

test = "python like object, tom love jerry"

test_re = r"l..e"

result = re.findall(test_re, test)

print(result)

2、split()

以正则表达式匹配的数据作为分割符分割数据 

import re

test = "root     pts/0        2019-12-06 08:54 (192.168.32.29)"

test_re = r"\s{2,}"

result = re.split(test_re, test)
print(result)

3、sub()

字符串替换  

import re

test = """http://192.168.1.1/MySQL
http://1.1.1.1/Ansible
http://10.30.2.1/zabbix
"""

new_host = "test.linux.com"

ip_re = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

new_url = re.sub(ip_re, new_host, test)
print(new_url)

五、compile()

将字符串的正则表达式编译成正则表达式对象

正则表达式对象.search()  match()  sub()  split()  findall()

优势:节省时间、提高效率 

非编译

import re
import time

ip_number = 0

start_time = time.time()

log_file = r"E:\projectA\files\access_log"

ip_re = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

f_obj = open(log_file, "r")

for line in f_obj:
	result = re.search(ip_re, line)
	if result:
		ip_number += 1

f_obj.close()
print(ip_number)
stop_time = time.time()
print(stop_time - start_time)

compile()编译正则对象

import re
import time

ip_number = 0

start_time = time.time()

log_file = r"E:\projectA\files\access_log"

ip_re = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

'''
	将正则表达式编译为对象
'''
ip_re_obj = re.compile(ip_re)

f_obj = open(log_file, "r")

for line in f_obj:
	'''
		调用正则对象的search()方法 
	'''
	result = ip_re_obj.search(line)
	if result:
		ip_number += 1

f_obj.close()
print(ip_number)
stop_time = time.time()
print(stop_time - start_time)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值