py_正则表达式练习

正则表达式:

#正则表达式
#键盘数字6上的符号,^表示行的开始,$ 表示行的结束

#test = "tm queal Tomorrow Moon"
'''
^tm #匹配tm开头的文字
$tm #匹配
'''
# 元字符
# /b /w
'''
#字符类
    [0-9] 等价于 \d[a-z0-9A-Z]等价于\w(只考虑英文)
#排除字符
    ^ 如在括号里面,表示排除这些字符 eg:[^a-zA-Z]
#选择字符
    |表示选择,
        (^\d{15}$)|(^\d(18)$)|(^\d{17}(\d|X|x))$  #匹配第一代身份证,第二代身份证
        解释:^表示开始,为15个数字,并且以数字结尾,
            或者以数字开头,18位的数字,并且以数字结尾,
            或以数字开头,17位的数字,并且以X或x结尾
#转义字符:
    例:需要匹配 127.0.0.1    [1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
    
'''

 

 
代码元字符说明
.匹配换行符以外的任意字符
\w匹配字母,数字,下划线或汉字
\W匹配字母,数字,下划线或汉字以外的字符
\s匹配单个空白符(包括Tab和换行符)
\S匹配单个空白符(包括Tab和换行符)以外的字符
\d匹配的数字
\b匹配单词的开始或者结束,但是通常是分界符是空格,标点符号或者换行
^匹配字符的开始
$匹配字符的结束
  

 

限定符说明举例
匹配前面字符的0次或者1次colou?r ,可匹配到color和colour
+匹配前面字符的一次或者多次go+gle,可以匹配到:gogle,goo…ogle
*匹配前面的字符的零次或者多次go*gle,可以匹配到:ggle,goo…ogle
{n}匹配前面字符的n次go{2},可以匹配到:google
{n,}匹配前面字符最少n次go{2,}gle,可以匹配到:google,goo...ogle
{n,m}匹配前面字符最少n次,最多m次google{1,3} 可以匹配到:google,googleee

 

 

import re   #导入正则表达式模块  
 
 
# 在py中match()
# re.match(pattern,string,[flags])

#  \w 匹配字母数字下划线或者数字 +匹配前面字符的一次或者多次
# r 代表原始字符,防止出现转义  
pattern = r'mr_\w+' 
string = "MR_CODE mr_code"
match = re.match(pattern,string,re.I) # i表示不区分大小写
print(match)
#ps <re.Match object; span=(0, 7), match='MR_CODE'>   
#  因为不匹配空格,故未匹配到 mr_code
#  将空格去掉后,MR_CODEmr_code 则可匹配到 MR_CODEmr_code

pattern2 = r'mr_\w+' 
string2 = "sssMR_CODE mr_code"
match2 = re.match(pattern2,string2,re.I) # i表示不区分大小写
print(match2)
# 若未匹配到,返回None


# 在py中search()
pattern3 = r'mr_\w+' 
string3 = "sssMR_CODE mr_code"
search = re.search(pattern3,string3,re.I) # i表示不区分大小写
print(search)
# <re.Match object; span=(3, 10), match='MR_CODE'>

pattern4 = r'mr_\w+' 
string4 = "ssssssMR_CODE mr_code"
search2 = re.search(pattern4,string4,re.I) # i表示不区分大小写
print(search2)
# <re.Match object; span=(6, 13), match='MR_CODE'>


# 在py中findall()
pattern5 = r'mr_\w+' 
string5 = "ssssssMR_CODE mr_code"
search5 = re.findall(pattern5,string5,re.I) # i表示不区分大小写
print(search5)
print("findall()")

# 在py中sub() 替换
pattern6 = r'1[34578]\d{9}'
string6 = "中奖号码为:89332,联系电话:13611111111"
search6 = re.sub(pattern6,'1我爱学py',string6) # i表示不区分大小写
print("sub()")
print(search6)
# 中奖号码为:89332,联系电话:1我爱学py

 

<think>首先,用户的问题是:“我想获取Python正则表达式练习示例”。用户明确要求Python正则表达式练习示例。 我之前的系统指令要求我: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 在用户消息中,有三个引用: - 引用[1]: 关于Python正则表达式前的'r'表示原生字符串,以及一些元字符的说明。 - 引用[2]: 一个Python正则表达式示例,包括一个正则表达式练习的数据生成器代码。 - 引用[3]: 关于Python正则表达式的介绍。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在本次对话中,这是第一个用户消息,所以没有上一次的问题。用户可能指的是引用是参考信息,但我的响应应基于他们当前的需求:获取Python正则表达式练习示例。 所以,我需要提供一个清晰的、结构化的响应,包括Python正则表达式练习示例。 结构响应: 1. **引言**: 简要介绍正则表达式和它在Python中的应用。 2. **练习示例**: 提供几个Python正则表达式练习示例。参考引用[2],那里有一个数据生成器和一些示例输出,我可以基于那个构建练习。 3. **逐步解决方案**: 每个示例应该包括问题描述、正则表达式模式和解法。 4. **使用引用**: 在适当的地方自然添加引用标识。例如,如果我提到原生字符串或元字符,引用引用[1]。 5. **代码格式化**: 代码块应使用Markdown格式。 6. **生成相关问题**: 在响应末尾,添加相关问题部分。 练习示例想法(基于引用[2]): - 引用[2]提供了一个数据生成器,输出类似:"Sun Oct 14 04:16:10 2153::sowi@.edu::5799672970-4--5" - 我可以创建练习来解析这些字符串: 1. 提取日期部分。 2. 提取电子邮件地址。 3. 提取数字部分。 - 还可以添加其他常见练习: - 匹配电子邮件地址。 - 匹配URL。 - 验证手机号码等。 确保使用中文回答。 最终响应结构: - 简要介绍。 - 练习示例列表。 - 每个示例包括:问题描述、模式、Python代码。 - 相关问题部分。 引用标识: - 当引用信息时,添加引用编号。 - 例如,提到元字符时,添加[^1]。 代码示例: - 使用Python的re模块。 - 包括代码块。 生成相关问题: - 如指令所示:"§§相关问题§§" 后跟问题列表。 相关问题可以包括: 1. 如何优化正则表达式的性能? 2. Python正则表达式的常见错误是什么? 3. 如何使用正则表达式匹配复杂模式? </think>以下是针对您查询的“Python正则表达式练习示例”的详细解答。我将基于Python的`re`模块,提供几个实用且循序渐进的练习示例。这些示例参考了站内引用中的信息(如原生字符串`r`前缀[^1]和正则表达式语法),并结合常见场景设计。每个示例包括问题描述、正则表达式模式解法说明、Python代码实现及输出结果。正则表达式是一种强大的字符串匹配工具,能高效处理文本数据[^3]。 ### 练习示例列表 我将提供三个逐步增加的练习示例,从简单到复杂,帮助您巩固Python正则表达式的应用。所有代码均使用Python标准库`re`模块。 #### 示例1: 匹配简单的电子邮件地址 **问题描述**: 给定一个字符串,提取出格式为`username@domain.tld`的电子邮件地址。注意,用户名由字母组成,域名由字母和点号组成,顶级域名(如`com`或`edu`)长度在2-5个字符之间(参考引用[2]中的邮箱示例)。 **正则表达式模式解法**: - 模式解析: 使用`r'\w+@\w+\.\w{2,5}'`。其中: - `\w+` 匹配一个或多个字母数字字符(用户名)。 - `@` 匹配字面符号。 - `\w+` 匹配域名主体。 - `\.` 匹配点号(需转义)。 - `\w{2,5}` 匹配2到5个字符的顶级域名。 - 原生字符串`r`前缀避免转义问题[^1]。 **Python代码**: ```python import re # 测试字符串 text = "Contact me at alice@example.com or bob@mail.edu for details." # 正则表达式匹配 pattern = r'\w+@\w+\.\w{2,5}' matches = re.findall(pattern, text) # 输出结果 print("匹配到的邮箱地址:", matches) # 输出: 匹配到的邮箱地址: ['alice@example.com', 'bob@mail.edu'] ``` #### 示例2: 解析引用[2]中的日志数据字符串 **问题描述**: 基于引用[2]提供的数据生成器输出(如`"Sun Oct 14 04:16:10 2153::sowi@.edu::5799672970-4--5"`),提取以下部分: - 日期时间(如`"Sun Oct 14 04:16:10 2153"`)。 - 电子邮件地址(如`"sowi@.edu"`)。 - 数字序列(如`"5799672970"`)。 使用单个正则表达式分组提取。 **正则表达式模式解法**: - 模式解析: 引用[2]的数据格式为`日期时间::邮箱::数字序列-数字-数字`。设计模式`r'(.+?)::(\w+@\.\w+)::(\d+).*'`: - `(.+?)` 非贪婪匹配任意字符直到`::`,捕获日期时间。 - `(\w+@\.\w+)` 捕获邮箱部分(注意`@.`需匹配字面)。 - `(\d+)` 捕获第一个数字序列。 - 使用分组`()`提取关键部分[^1]。 **Python代码**: ```python import re # 测试字符串(来自引用[2]示例) text = "Sun Oct 14 04:16:10 2153::sowi@.edu::5799672970-4--5" # 正则表达式匹配并分组提取 pattern = r'(.+?)::(\w+@\.\w+)::(\d+).*' match = re.search(pattern, text) if match: date_time = match.group(1) email = match.group(2) number_seq = match.group(3) print("日期时间:", date_time) # 输出: 日期时间: Sun Oct 14 04:16:10 2153 print("邮箱地址:", email) # 输出: 邮箱地址: sowi@.edu print("数字序列:", number_seq) # 输出: 数字序列: 5799672970 else: print("未匹配到数据") ``` #### 示例3: 验证和提取复杂URL **问题描述**: 给定一个URL字符串(如`"https://www.example.com:8080/path/to/page?query=test"`),验证其格式并提取协议、域名、端口和路径。顶级域名需符合常见类型(如`com`、`edu`参考引用[2])。 **正则表达式模式解法**: - 模式解析: 使用`r'(https?)://([\w.-]+)\.(\w{2,5})(?::(\d+))?(/.*)?'`: - `(https?)` 捕获协议(`http`或`https`)。 - `([\w.-]+)` 捕获域名主体。 - `\.(\w{2,5})` 捕获顶级域名(2-5字符)。 - `(?::(\d+))?` 可选捕获端口号(非贪婪)。 - `(/.*)?` 可选捕获路径。 - 利用`?`表示可选部分提高灵活性[^3]。 **Python代码**: ```python import re # 测试字符串 url = "https://www.example.com:8080/path/to/page?query=test" # 正则表达式匹配和分组 pattern = r'(https?)://([\w.-]+)\.(\w{2,5})(?::(\d+))?(/.*)?' match = re.search(pattern, url) if match: protocol = match.group(1) domain = match.group(2) tld = match.group(3) port = match.group(4) or "80" # 默认端口 path = match.group(5) or "/" # 默认路径 print("协议:", protocol) # 输出: 协议: https print("域名主体:", domain) # 输出: 域名主体: www.example print("顶级域名:", tld) # 输出: 顶级域名: com print("端口:", port) # 输出: 端口: 8080 print("路径:", path) # 输出: 路径: /path/to/page?query=test else: print("URL格式无效") ``` ### 练习建议 为了加深理解,您可以: 1. 修改以上代码的输入字符串,测试不同边界情况。 2. 引用[2]提供了一个简易数据生成器(见其代码),用于生成随机日志数据练习匹配。 3. 使用`re.match()`、`re.search()`和`re.findall()`区分不同匹配场景。 正则表达式的学习依赖于实践,建议从简单模式开始逐步增加复杂度[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_TestMG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值