【Python学习笔记】正则表达式和re正则模块
一、用于匹配单个字符的元字符
符号 | 说明 |
---|---|
. | 除了\n换行符,任意单个字符 |
\d | 任意单个数字 |
\D | 取反任意单个数字 |
\w | 任意单个字母或字符或者下划线“_” |
\W | 取反任意单个字母或字符或者下划线“_” |
\s | 任意单个空白字符 |
\S | 取反任意单个空白字符 |
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符 |
\f | 匹配单个换页符 |
\n | 匹配单个换行符 |
\r | 匹配单个回车符 |
\v | 匹配单个垂直制表符 |
\t | 匹配单个制表符 |
二、匹配字符出现次数
符号 | 说明 |
---|---|
* | 前一个字符出现0次或者任意次 |
+ | 前一个字符至少出现1次,或者更多次 |
? | 前一个字符可有可无 |
{n} | 精确出现n次 |
{n,} | 至少出现n次或更多次 |
{n,m} | 至少出现n次,至多出现m次 |
( ) | 分组 |
?
问号的两种含义
- 贪婪模式,默认
- 按最长匹配
- 非贪婪模式
- 如果
?
紧跟在了一个表示次数的元字符后,以非贪婪模式进行匹配 - 在非贪婪模式下,按最短匹配
- 如果
三、匹配字符出现位置
字符 | 说明 |
---|---|
^string |
以string 开头 |
string$ |
以string 结尾 |
四、re.search(pattern, string)
- 在
string
中搜索被正则表达式匹配的数据 - 如果能匹配,返回
Match object
匹配对象 - 否则返回
None
import re
data_01 = "python like class object"
test_re = r"l..e"
result = re.search(test_re, data_01)
print(result)
<re.Match object; span=(7, 11), match='like'>
import re
data_01 = "python like class object"
test_re = r"A..e"
result = re.search(test_re, data_01)
if result:
print("可以匹配数据!!!!")
else:
print("无数据!!!!")
五、根据Match object
提供的方法获取数据
1.group()
以字符串的形式返回正则表达式匹配到的所有数据
import re
data = "python like class object"
test_re = r"l..e"
result = re.search(test_re, data)
if result:
print("可以匹配数据!!!!")
data_01 = result.group()
print(data_01)
else:
print("无数据!!!!")
2.groups()
- 以元组的方式返回数据
- 包含正则表达式分组匹配的数据
import re
data = "python like class object"
test_re = r"(l.)(.)e"
result = re.search(test_re, data)
if result:
print("可以匹配数据!!!!")
data_02 = result.groups()
print(data_02)
else:
print("无数据!!!!")
import re
line = "192.168.183.11 - - [24/Feb/2020:11:42:08 +0800]"
line_re = r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s-\s-\s\[(.*?)\]"
result = re.search(line_re, line)
if result:
print("可以匹配数据!!!!")
data_01 = result.group()
print(data_01)
print("---------" * 10)
data_02 = result.groups()
print(data_02)
else:
print("无数据!!!!")
3.groupdict()
- 以字典的形式返回数据
- 包含分组
- 为分组进行命名
(?P<组名>.........)
import re
line = "192.168.183.11 - - [24/Feb/2020:11:42:08 +0800]"
line_re = r"(?P<客户端地址>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s-\s-\s\[(?P<访问时间>.*?)\]"
result = re.search(line_re, line)
if result:
print("可以匹配数据!!!!")
data_03 = result.groupdict()
print(data_03)
else:
print("无数据!!!!")
改写webUV
import re
web_log = r"D:\project0805\files\access_log"
ip_regex = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
# 获取客户端地址
ip_list = []
with open(web_log, mode="r") as fobj:
for line in fobj:
result = re.search(ip_regex, line)
if result:
ip_list.append(result.group())
# 统计UV
for ip in set(ip_list):
print("IP地址: %s, 次数: %s" % (ip, ip_list.count(ip)))
六、re.split(pattern, string)
使用正则匹配的字符作为分割符,分割字符串
import re
data = "root pts/0 2021-08-10 16:16 (10.10.9.230)"
test_re = r"\s{2,}"
result = re.split(test_re, data)
print(result)
七、re.sub(pattern, new, string)
将正则表达式匹配到的数据替换为指定的
new
内容
import re
url_list = [
"http://10.1.1.1/docker/dash",
"http://172.16.1.1/test/login",
"http://192.168.10.3/logo.jpg"
]
ip_regex = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
for url in url_list:
new_url = re.sub(ip_regex, "test.linux.com", url)
print(new_url)
八、re.findall(pattern, string)
以列表的形式返回正则表达式匹配到的所有数据
import re
data = "python like golang, linux love unix"
test_re = r"l..e"
result = re.findall(test_re, data)
print(result)