python3常用库之正则re库使用

常用正则基础规则

.    匹配除换行符(\n、\r)之外的任何单个字符
\s  是匹配所有空白符,包括换行
\S  非空白符,不包括换行
\w  匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
\W 匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。
\d  匹配任意一个阿拉伯数字。等价于 [0-9]
\D  匹配一个非数字字符。等价于 [^0-9]。
\b  匹配一个单词边界,即字与空格间的位置。
\B  非单词边界匹配。
^   匹配输入字符串的开始位置。当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。
$   匹配输入字符串的结尾位置。
()   用于分组和捕获子表达式。
(?: ) 用于分组但不捕获子表达式。
[]   匹配括号内的任意一个字符
*    匹配前面的子表达式零次或多次。
+   匹配前面的子表达式一次或多次。
?   匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
|    指明两项之间的一个选择。
{n} 匹配确定的 n 次。
{n,} 至少匹配n 次。
{n, m} 最少匹配 n 次且最多匹配 m 次。

* 和 + 限定符都是贪婪的,它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。
通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。

分组
(exp) 分组。
使用分组的编号来引用分组,\1 \2 ...
(?P<name>exp) 命名分组,可以通过分组名引用该分组
命名分组使用(?P=name)引用分组

(?:exp) 非捕获分组
(?=exp) 非捕获分组,正向肯定预查,用于匹配某个子表达式后的位置,用于确保某一部分的匹配被后续某一部分的条件匹配
exp1(?=exp2):查找 exp2 前面的 exp1。
(?!exp) 非捕获分组,正向否定预查,用于确保某一部分的匹配不被后续某一部分的条件匹配
exp1(?!exp2):查找后面不是 exp2 的 exp1。
(?<=exp)    非捕获分组,反向肯定预查,与正向肯定预查类似,只是方向相反。
(?<=exp2)exp1:查找 exp2 后面的 exp1。
(?<!exp)    非捕获分组,反向否定预查,与正向否定预查类似,只是方向相反
(?<!exp2)exp1:查找前面不是 exp2 的 exp1。

re库

# re 用来实现正则表达式的库

import re

s_m = """I enjoy going fishing.
I have a good time every day."""

s = "I have a good time every day."

# match()方法从字符串的开始处进行匹配,如果在起始位置匹配成功,返回Match对象,否则返回None
match_obj = re.match("I", s)
print(match_obj)  # <re.Match object; span=(0, 1), match='I'>
print(match_obj.start())  # 0
print(match_obj.end())  # 1
print(match_obj.span())  # (0,1)
print(match_obj.string)  # I have a good time every day.
print(match_obj.group())  # I
match_obj = re.match("good", s)
print(match_obj)  # None

match_obj = re.match(r"(.*) good (.*?) .*", s, re.I)  # re.I 表示忽略大小写
print(match_obj.groups())  # ('I have a', 'time')
print(match_obj.group())  # I have a good time every day.
print(match_obj.group(0))  # I have a good time every day.
print(match_obj.group(1))  # I have a
print(match_obj.group(2))  # time


# search()方法用于在整个字符串中搜索第一个匹配的值,如果匹配成功,返回Match对象,否则返回None
match_obj = re.search("I", s)
print(match_obj)  # <re.Match object; span=(0, 1), match='I'>
print(match_obj.span())  # (0, 1)
match_obj = re.search("good", s)
print(match_obj)  # <re.Match object; span=(9, 13), match='good'>
print(match_obj.span())  # (9, 13)
match_obj = re.search("time", s_m)
print(match_obj)  # <re.Match object; span=(37, 41), match='time'>
print(match_obj.span())  # (37, 41)
match_obj = re.search("(?P<province>\d{2}).*(?P<city>\d{2}).*(?P<block>\d{2}).*", "13g00x21yy")
print(match_obj.groupdict())

# findAll()方法在整个字符串中搜索所有符合匹配模式的字符串,返回列表,如果未匹配到结果,则返回空列表
result = re.findall(r"\w+", s)
print(result)  # ['I', 'have', 'a', 'good', 'time', 'every', 'day']
result = re.findall(r"(\w+)=(\d+)", "set width=20 and height=10")
print(result)  # [('width', '20'), ('height', '10')]


# finditer()方法在整个字符串中搜索所有符合匹配模式的字符串,返回所有Match对象的迭代器
it = re.finditer(r"\w+", s)
for match in it:
    print(match.group())
# I
# have
# a
# good
# time
# every
# day


# sub()方法实现字符串的替换,并返回替换后的字符串
date = "2024-10-29"
date = re.sub(r"\D", "/", date)
print(date)  # 2024/10/29


def handle(matched):
    value = int(matched.group("value"))
    return str(value + 1)


s1 = "A2B3"
print(re.sub(r"(?P<value>\d+)", handle, s1))  # A3B4


# split()方法根据模式匹配来实现分割字符串,返回列表,,如果未匹配到结果,则返回空列表
print(re.split("\W+", s))  # ['I', 'have', 'a', 'good', 'time', 'every', 'day', '']
print(re.split("\W+", s, 3))  # 设定最大分割次数3 ['I', 'have', 'a', 'good time every day.']


# compile将正则表达式编译为Pattern对象
pattern = re.compile(r"([a-z]+) ([a-z]+)", re.I)
match_obj = pattern.match(s)
print(match_obj.groups())  # ('I', 'have')

# (?=...) 正向预查
pattern = re.compile(r"abc(?=def)")
match_obj = pattern.search("abcdef")
print(match_obj.group())  # abc
match_obj = pattern.search("abcef")
print(match_obj)  # None

# (?!...) 负向预查
pattern = re.compile(r"abc(?!def)")
match_obj = pattern.search("abcdef")
print(match_obj)  # None
match_obj = pattern.search("abcef")
print(match_obj.group())  # abc

pattern = re.compile(r"[a-zA-Z]+(?P<val1>\d+)[a-zA-Z]+(?P<val2>\d+)")
match_obj = pattern.search("AC2Bd34")
print(match_obj.groupdict())  # {'val1': '2', 'val2': '34'}

pattern = re.compile(r"\w+")
result = pattern.findall(s)
print(result)  # ['I', 'have', 'a', 'good', 'time', 'every', 'day']
result = pattern.findall(s, 0, 15)
print(result)  # ['I', 'have', 'a', 'good', 't']

text = "colors: red,colors:blue ;mode:   rgb,mode:cmyk"
pattern = re.compile(r"(?:(colors)[:\s]+(\w+)(?:[,;\s]|$))|(?:(mode)[:\s]+(\w+)(?:[,;\s]|$))")  # (?:...) 在正则中标识非捕获组
it = pattern.finditer(text)
for match in it:
    print(match.groups())

 

posted @   carol2014  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示