【Python学习笔记】正则表达式和re正则模块

一、用于匹配单个字符的元字符

符号 说明
. 除了\n换行符,任意单个字符
\d 任意单个数字
\D 取反任意单个数字
\w 任意单个字母或字符或者下划线“_”
\W 取反任意单个字母或字符或者下划线“_”
\s 任意单个空白字符
\S 取反任意单个空白字符
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符
\f 匹配单个换页符
\n 匹配单个换行符
\r 匹配单个回车符
\v 匹配单个垂直制表符
\t 匹配单个制表符

二、匹配字符出现次数

符号 说明
* 前一个字符出现0次或者任意次
+ 前一个字符至少出现1次,或者更多次
? 前一个字符可有可无
{n} 精确出现n次
{n,} 至少出现n次或更多次
{n,m} 至少出现n次,至多出现m次
( ) 分组
  • ?问号的两种含义
  1. 贪婪模式,默认
    1. 按最长匹配
  2. 非贪婪模式
    1. 如果?紧跟在了一个表示次数的元字符后,以非贪婪模式进行匹配
    2. 在非贪婪模式下,按最短匹配

三、匹配字符出现位置

字符 说明
^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)