【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)
 
                     
                
             
                
评论