正则表达式基础
正则表达式
正则表达式(Regular Expressions,简称 regex)是一种强大的工具,用于匹配和处理文本。Python 通过 re 模块提供了对正则表达式的支持。下面是一些基本的使用方法:
常用的元字符
.: 匹配任意单个字符(除了换行符)。
^: 匹配字符串的开头。
$: 匹配字符串的结尾。
*: 匹配前面的字符 0 次或多次。
+: 匹配前面的字符 1 次或多次。
?: 匹配前面的字符 0 次或 1 次。
{n}: 匹配前面的字符恰好 n 次。
{n,}: 匹配前面的字符至少 n 次。
{n,m}: 匹配前面的字符至少 n 次,至多 m 次。
\d: 匹配数字字符(等价于 [0-9])。
\D: 匹配非数字字符。
\w: 匹配字母、数字或下划线(等价于 [a-zA-Z0-9_])。
\W: 匹配非字母、数字或下划线。
\s: 匹配空白字符(包括空格、制表符、换行符等)。
\S: 匹配非空白字符。
[]: 匹配括号内的任意一个字符。
|: 或操作,匹配左边或右边的表达式
\b:单词边界,这是一个只匹配单词的开始和结尾的零宽断言
常用的函数
re.compile():用于将正则表达式字符串编译为正则表达式对象
re.match(): 从字符串的开头开始匹配。
re.search(): 遍历字符串,找到正则表达式匹配的第一个位置
re.findall(): 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回
re.finditer(): 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回
re.sub(): 找到所有匹配的子字符串,并替换为新的内容
re.split():在正则表达式匹配的地方进行分割,并返回一个列表
综合函数的使用方法
接下来讲的函数没有先后顺序,案例讲到哪一个就说明哪一个
注意:
书写表达式的时候,在前面加上一个小写r,如,r'hello'这种形式
import re
# 编译正则表达式,忽略大小写
pattern = re.compile(r'hello', re.IGNORECASE | re.MULTILINE)
# 使用编译后的正则表达式对象进行匹配
text = "Hello, world!"
match = pattern.search(text)
#这里使用search去进行匹配
if match:
print("找到匹配:", match.group()) # 输出: Hello
#这里匹配到后使用group()函数提取出匹配到的字符串
else:
print("没有找到匹配")
re.compile() 是 Python 中用于将正则表达式字符串编译为正则表达式对象的函数。编译后的正则表达式对象可以重复使用,这样可以提高效率,尤其是在需要多次使用同一个正则表达式时。
具体参数说明
#re.compile(pattern, flags=0)
#pattern: 正则表达式的字符串,也就是匹配的字符串。
#flags: 可选参数,用于控制正则表达式的匹配方式(如忽略大小写、多行匹配等)。
#re.IGNORECASE 或 re.I: 忽略大小写。
#常用的flags参数为:
#re.MULTILINE 或 re.M: 多行模式,使 ^ 和 $ 匹配每行的开头和结尾。
#re.DOTALL 或 re.S: 使 . 匹配包括换行符在内的所有字符。
#re.ASCII 或 re.A: 使 \w, \W, \b, \B, \s, \S 只匹配 ASCII 字符。
#re.VERBOSE 或 re.X: 允许在正则表达式中添加注释和空白符,使其更易读
import re
# 编译正则表达式
pattern = re.compile(r'(\d+)-(\d+)-(\d+)')
# 使用编译后的正则表达式对象进行匹配
text = "这里有一串数字为:123-456-7890。"
match = pattern.search(text)
if match:
print("完整匹配:", match.group(0)) # 输出: 123-456-7890,匹配的是整个字符串,也可以是使用match.group(),效果一样
print("第一部分:", match.group(1)) # 输出: 123,匹配的是第一个圆括号里面的内容
print("第二部分:", match.group(2)) # 输出: 456,匹配的是第二个圆括号里面的内容
print("第三部分:", match.group(3)) # 输出: 7890,匹配的是第三个圆括号里面的内容
import re
pattern = re.compile(r"\d+",re.M)
text = "我有 3 只猫和 2 只狗。"
matches = pattern.findall(text)#返回是['3', '2']
print("找到的数字:", matches)
#其中如果使用的是finditer(),那么返回的是一个可便利的迭代器
import re
pattern = re.compile(r"\d+",re.M)
text = "我有 3 只猫和 2 只狗。"
matches = pattern.finditer(text)#返回是['3', '2']
print("找到的数字:", matches)
for i in matches:
print(i.group())
import re
p=re.compile(r'xiaobai|xiaohong|xiaohuang')
text="xiaobai正在来的路上,xiaohong在吃饭,xiaohuang正玩游戏"
match=p.sub("xiaohei",text,count=1)
print(match)#xiaohei正在来的路上,xiaohong在吃饭,xiaohuang正玩游戏
match=p.sub("xiaohei",text)
print(match)#xiaohei正在来的路上,xiaohei在吃饭,xiaohei正玩游戏
分组操作:()
说明:
使用圆括号的时候,从左到右数"("的数量,第一个就是第一组为group(1)
import re
pattern=re.compile('(a(b)c)(d)')
match=pattern.search('abcd')
print(match.group(0))#'abcd'
print(match.group(1))#'abc'
print(match.group(2))#'b'
print(match.group(3))#'d'
print(match.group(1,3))#('abc', 'd')
#findall()与分组的使用
import re
text = "John has 3 apples, Jane has 5 oranges"
result = re.findall(r'(\w+)\s+has\s+(\d+)\s+(\w+)', text)
print(result) # 输出: [('John', '3', 'apples'), ('Jane', '5', 'oranges')]
#返回的是按规则匹配的元组。与下面没有分组相比,分组会强行将同一级别()中的内容放到一个元组中,并且有了
#()后,使用findall就只获得()里面的内容了
import re
text = "John has 3 apples, Jane has 5 oranges"
result = re.findall(r'\w+\s+has\s+\d+\s+\w+', text)
print(result) # 输出:['John has 3 apples', 'Jane has 5 oranges']
import re
text = "John has 3 apples, Jane has 5 oranges"
result = re.findall(r'(\w+)\s+has\s+((\d+)\s+\w+)', text)#会按照分组等级一个个的找
print(result) # [('John', '3 apples', '3'), ('Jane', '5 oranges', '5')]
命名组
命名组的语法是 Python 特有的扩展语法:(?P<name>)
import re
pattern=re.compile(r'(?P<word>\b\w+\b)')
match=pattern.search('hello world')
print(match.group('word'))#'hello'
print(match.group(1))#'hello',第一个括号
贪婪模式和非贪婪模式
import re
# 贪婪匹配
pattern1 = r"<.*>" # 匹配 < 和 > 之间的任意字符(尽可能多)
text = "<html><head><title>Title</title></head></html>"
match1 = re.search(pattern1, text)
pattern2=r"<.*?>"
match2 = re.search(pattern2, text)
print("贪婪匹配:", match1.group())#<html><head><title>Title</title></head></html>
print("贪婪匹配:", match2.group())#<html>

浙公网安备 33010602011771号