re模块是python的内置模块
文章参考: [Python re 模块 | 菜鸟教程](www.runoob.com/python3/pyt...
用于对于字符串中数据匹配,搜索,操作
需要查找特定的模式或替换某些字符
1.re模块的导入
python
import re
2.常用re函数
(1)re.match()函数
从字符串起始位置 匹配正则表达式模式
基本语法 : | re.match(pattern, string, flags=0) |
re.match()函数包含三个主要参数:
- **
pattern** (必选):这是一个字符串,表示你要匹配的正则表达式规则,例如r"\d+"用于匹配数字。 - **
string** (必选):这是待检测的目标字符串。 - **
flags** (可选):用于控制匹配方式的标志,例如忽略大小写 (re.I)、使点号匹配换行符 (re.S) 等。这是一个可选参数,默认为 0,表示不使用任何特殊标志。
基本查找
python
import re
result = re.match(r'Hello', 'Hello, world!')
print(result) # 输出: <re.Match object; span=(0, 5), match='Hello'>
print(result.group()) # 输出: Hello
使用分组提取内容
python
#**使用分组提取内容**
import re
line = "Cats are smarter than dogs" # 模式中有两个括号,创建了两个分组 matchObj = re.match(r'(.*) are (.*?) .*', line)
if matchObj:
print("整个匹配的字符串: ", matchObj.group()) # Cats are smarter than dogs
print("第一个分组匹配的内容: ", matchObj.group(1)) # Cats
print("第二个分组匹配的内容: ", matchObj.group(2)) # smarter
else:
print("No match!!")
注意: re.match()只检查字符串的开头 。这是它和 re.search()最关键的区别,后者会扫描整个字符串
(2)re.search()函数
用于在字符串中扫描并找到第一个 符合正则表达式模式的匹配项
基本语法 : | re.search(pattern, string, flags=0) |
re.search()函数包含三个主要参数 :(与re.search()函数是一致的只是搜索范围不同)
- **
pattern** (必选):一个字符串,代表你要匹配的正则表达式规则,例如r"\d+"表示匹配一个或多个数字。 - **
string** (必选):待搜索的目标字符串。 - **
flags** (可选):用于控制匹配方式的标志,例如忽略大小写、多行模式等。这是一个可选参数,默认为0。常用的标志有:re.I/re.IGNORECASE: 忽略大小写 。re.M/re.MULTILINE: 影响^和$的行为,使它们匹配每一行的开头和结尾 。re.S/re.DOTALL: 使点号.匹配包括换行符在内的所有字符 。
基本查找
python
import re
result = re.search(r'\d+', '订购了3件商品,总计123元。')
if result:
print(result.group()) # 输出: 3 (注意:这里匹配到的是第一个数字序列"3")
使用分组提取内容
在正则表达式中使用圆括号 ()可以创建分组,匹配成功后可以通过匹配对象的方法提取特定部分的内容 。
.group(0)或.group(): 获取整个模式匹配的完整文本。.group(1),.group(2), ...: 按顺序获取第1个、第2个...分组匹配的文本。.groups(): 返回一个包含所有分组匹配文本的元组。
python
import re
text = "用户的邮箱地址是:contact@example.com,欢迎联系。"
# 模式中有两个分组:(\S+) 和 (\S+\.\S+)
match_obj = re.search(r'(\S+)@(\S+\.\S+)', text)
if match_obj:
print("完整邮箱:", match_obj.group()) # contact@example.com
print("用户名:", match_obj.group(1)) # contact
print("域名:", match_obj.group(2)) # example.com
print("所有分组:", match_obj.groups()) # ('contact', 'example.com')
注意事项
与 re.match()的区别 :这是最关键的一点。re.match()只检查字符串的起始位置 是否符合模式,而 re.search()会扫描整个字符串
python
import re
line = "Dog is the best friend of humans"
match_result = re.match(r'best', line) # 从开头匹配"best",失败
search_result = re.search(r'best', line) # 在整个字符串中搜索"best",成功
(2)re.findall()函数
用于查找所有 符合正则表达式的子串,,并返回所有与指定模式匹配的非重叠子串组成的列表
基本语法 : | re.search(pattern, string, flags=0) |
返回值 :一个列表(list)。如果找到匹配项,列表包含所有匹配的子串;如果未找到,则返回空列表 []
re.findall()函数包含三个主要参数 :(与re.search()函数是一致的)
- **
pattern** (必选):一个字符串,代表你要匹配的正则表达式规则,例如r"\d+"表示匹配一个或多个数字。 - **
string** (必选):待搜索的目标字符串。 - **
flags** (可选):用于控制匹配方式的标志,例如忽略大小写、多行模式等。这是一个可选参数,默认为0。常用的标志有:re.I/re.IGNORECASE: 忽略大小写 。re.M/re.MULTILINE: 影响^和$的行为,使它们匹配每一行的开头和结尾 。re.S/re.DOTALL: 使点号.匹配包括换行符在内的所有字符 。
基本查找
python
#查找字符串中的所有数字
import re text = "我的电话是123,你的电话是456。"
result = re.findall(r'\d+', text)
print(result) # 输出:['123', '456']
使用分组提取内容
python
#当正则表达式中包含圆括号 `()`分组时,`re.findall()`会优先返回分组捕获的内容,而不是整个匹配的内容
import re
text = "请联系support@example.com或info@domain.org"
# 模式中有分组,只提取@后面的域名部分
result = re.findall(r'\w+@([\w.]+)', text)
print(result) # 输出:['example.com', 'domain.org']
使用标志位(flags)
使用 flags=re.I来忽略英文字母的大小写
python
import re
text = "Hello HELLO hello"
result = re.findall(r'hello', text, flags=re.IGNORECASE)
print(result) # 输出:['Hello', 'HELLO', 'hello']
处理大量数据:re.finditer()
如果需要处理非常长的文本,re.finditer()是更好的选择。它不会一次性返回所有结果,而是返回一个迭代器(iterator),逐个产生匹配对象,从而节省内存
python
import re
text = "数字有123和456还有789。" # 使用finditer逐个处理匹配项
for match in re.finditer(r'\d+', text):
print(f"找到数字: {match.group()},位置在: {match.span()}")
# 输出:
# 找到数字: 123,位置在: (3, 6)
# 找到数字: 456,位置在: (7, 10)
# 找到数字: 789,位置在: (11, 14)