Python练习-- loop

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

names = ['Michael','Bob','Tracy']
for name in names:
    print(name)

sum =0
for x in range(101):
    sum= sum+x
print(sum)


sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

L = ['Bart', 'Lisa', 'Adam']

for name in L:
    print('Hello',name)
<think>我们正在讨论Python正则表达式的练习教程和示例代码。根据用户当前请求,用户希望获得正则表达式的练习教程和示例代码。结合历史引用中的三个示例(匹配数字、文本处理、地址匹配),我们可以为用户提供一系列循序渐进的练习示例。首先,我们需要确保所有正则表达式模式使用raw字符串(r'')以避免转义问题。以下将按照从简单到复杂的顺序提供练习,每个练习包括问题描述、正则表达式模式和示例代码。注意:用户的历史引用中展示了匹配数字、简单文本匹配和美国地址匹配的实例。我们将这些纳入练习设计中,同时扩展更多常见场景。###1.匹配整数或小数(含正负号)根据引用[1]中的描述,合法数字包括整数(89,-23,+34,0)和小数(2.33,-2.33,+23.889等),不合法的情况包括前导零(如0001)、小数点开头或结尾(233.,.223)等。正则表达式模式解析:-整数部分:`[-+]?`(可选正负号)后跟`(0|[1-9]\d*)`(0或非零开头的整数)-小数部分:在整数部分后面加上`\.\d+`(小数点后至少一位数字)-整体数字:整数部分后接可选的小数部分(使用`(\.\d+)?`)因此,完整的正则表达式为:`r'[-+]?(0|[1-9]\d*)(\.\d+)?'`示例代码:```pythonimportrepattern=r'[-+]?(0|[1-9]\d*)(\.\d+)?'test_cases=['89','-23','+34','0','2.33','-2.33','+23.889','9.00','0.22','9.000','0001','233.','.223','0023.2']fortestintest_cases:result=re.fullmatch(pattern,test)print(f"'{test}':{'合法'ifresultelse'不合法'}")```###2.匹配特定关键词(如引用[2]中的文本处理)引用[2]展示了在一个文本文件中查找包含特定关键词(如itcast,itheima)的行。我们可以使用`re.findall`或`re.finditer`来提取匹配的单词。练习:从一个多行字符串中找出所有以“it”开头的单词(不区分大小写)。正则表达式模式:`r'\bit\w*'`(`\b`表示单词边界,`\w*`匹配零个或多个单词字符)示例代码:```pythonimportretext="""测试文件123.txtitcasthellopythonitcastc++itheimaiositheimaphphelloitcastpythonwww.itcast.cnc++itheimaiositheimaphp"""#查找所有以"it"开头的单词pattern=r'\bit\w*'matches=re.findall(pattern,text,re.IGNORECASE)#re.IGNORECASE忽略大小写print("匹配的单词:",matches)```###3.匹配美国街道地址(引用[3])引用[3]要求匹配美国街道地址,如“1180BordeauxDrive”或“3120DelaCruzBoulevard”。地址格式为:门牌号(数字)后接街道名称(可能包含空格和点),最后是街道类型(如Drive,Street,Boulevard等)。正则表达式设计:-门牌号:`\d+`(一个或多个数字)-街道名称:由字母、空格和可能的点组成,注意可能有多个单词(如“DelaCruz”),所以用`[\w\s\.]+`(但这样可能太宽泛,我们可以更精确:要求至少一个字母,并且允许空格、点和单引号)-街道类型:一个或多个单词(如“Boulevard”),可以用`[A-Za-z]+`(但实际可能有空格,如“MainStreet”),但题目中似乎只给了一个单词的类型,所以暂不考虑多单词类型。但为了灵活性,可以允许多单词类型:`([A-Za-z]+(?:\s[A-Za-z]+)*)`因此,一个更灵活的模式:`r'\d+\s[\w\s\.]+\s(?:Drive|Street|Avenue|Boulevard|Road|Lane)\b'`但是,这个模式并不完美,因为街道名称中可能包含数字(如“1stAvenue”),但题目中未提及。我们按照题目要求,假设街道名称由字母和空格组成。改进:街道名称允许字母、空格、点、单引号和连字符,并且至少两个字符:`[A-Za-z\s\.'-]{2,}`最终模式(简单版):`r'\d+\s[A-Za-z\s\.\-]+\s(?:Drive|Street|Avenue|Boulevard|Road|Lane)\b'`注意:街道类型我们用非捕获组列出常见词汇,但实际应用中可能更长,这里仅举例。示例代码:```pythonimportrepattern=r'\d+\s[A-Za-z\s\.\-]+\s(?:Drive|Street|Avenue|Boulevard|Road|Lane)\b'addresses=["1180BordeauxDrive","3120DelaCruzBoulevard","123MainStreet","45AElmStreet",#包含字母的门牌号?题目未要求,这里不合法"10005thAvenue",#街道名称含数字,不合法?但实际应允许,但题目未说明,我们暂时按原规则(不允许数字)所以不匹配"1InfiniteLoop"#街道类型不在列表中,不匹配]foraddrinaddresses:match=re.search(pattern,addr)print(f"'{addr}':{'匹配'ifmatchelse'不匹配'}")```###4.匹配电子邮件地址常见电子邮件地址格式:用户名@域名-用户名:允许字母、数字、点、下划线、百分号、加号和连字符。通常以字母开头。-域名:字母、数字、连字符和点,最后是顶级域名(至少两个字母)。正则表达式模式:`r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'`示例代码:```pythonimportrepattern=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'emails=["user@example.com","first.last@domain.co","user_name@sub.domain.com","user+filter@example.com","invalid.email@.com",#无效"@domain.com",#无效"user@domain"#无效(缺少顶级域名)]foremailinemails:match=re.fullmatch(pattern,email)print(f"'{email}':{'有效'ifmatchelse'无效'}")```###5.提取URL(如引用[2]中的www.itcast.cn)URL可能包含协议(http/https)、域名、路径等。简单起见,我们匹配常见的URL格式。正则表达式模式:`r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+|www\.[a-z0-9-]+\.[a-z]{2,}(?:/[\w-./?%&=]*)?'`但较为复杂,这里提供一个简化版本,仅匹配域名部分(如www.itcast.cn)或带协议的URL:`r'(?:https?://)?(?:www\.)?[\w-]+\.[a-z]{2,}(?:/[\w./?%&=]*)?'`示例代码:```pythonimportrepattern=r'(?:https?://)?(?:www\.)?[\w-]+\.[a-z]{2,}(?:/[\w./?%&=]*)?'urls=["http://example.com","https://www.example.com/path/to/file.html?query=string","www.example.cn","sub.domain.org","invalid_domain.",#无效"http://localhost"#有效?但我们的模式要求顶级域名至少两个字母,所以这个不匹配]forurlinurls:match=re.search(pattern,url)print(f"'{url}':{'匹配'ifmatchelse'不匹配'}")```###练习建议1.从简单匹配开始(如数字、单词),逐步过渡到复杂结构(邮件、URL)。2.使用在线正则表达式测试工具(如regex101.com)辅助理解和调试。3.尝试编写测试用例,覆盖合法和非法情况。§§相关问题§§1.如何匹配中文字符(如中文名字或地址)?2.正则表达式中的贪婪模式和非贪婪模式有什么区别?3.如何用正则表达式匹配重复出现的模式(如连续相同的单词)?</think> 下面为您提供Python正则表达式的系统化练习教程和示例代码,从基础到进阶逐步讲解。内容结合您的历史引用[^1][^2][^3]和实际需求设计。 ### 基础语法概览 常用元字符含义: - `\d`匹配数字,`\w`匹配单词字符 - `[]`字符集,`*`零或多次,`+`一或多次 - `^`开始位置,`$`结束位置 - `|`或逻辑,`()`捕获分组 $$ \text{正则表达式} = \begin{cases} \text{基础匹配} & \text{字符类} \\ \text{量词控制} & \text{边界控制} \\ \text{分组引用} & \text{高级断言} \end{cases} $$ ### 基础练习示例 #### 1. 数值匹配(基于引用[^1]) ```python import re def validate_numbers(input_str): pattern = r'^[-+]?(0|[1-9]\d*)(\.\d+)?$' # 匹配正负整数/小数 return bool(re.match(pattern, input_str)) print(validate_numbers("+3.14")) # True print(validate_numbers("0023")) # False(前导零不合法) ``` #### 2. 关键词提取(基于引用[^2]) ```python text = """python 正则表达式练习 测试文件123.txt itcast hello python www.itcast.cn""" # 提取所有包含"it"的单词 matches = re.findall(r'\b\w*it\w*\b', text, re.IGNORECASE) print(matches) # ['itcast', 'itcast', 'www.itcast.cn'] ``` #### 3. 地址匹配(基于引用[^3]) ```python def extract_us_address(text): pattern = r'\b\d{1,5}\s([A-Z][a-z]+\s?)+ (Street|Avenue|Boulevard|Drive)\b' return re.search(pattern, text) address = "快递寄到3120 De la Cruz Boulevard, 谢谢" print(extract_us_address(address).group()) # "3120 De la Cruz Boulevard" ``` ### 进阶练习 #### 4. 复杂结构匹配 ```python # 匹配邮箱和URL混合文本 text = "联系:admin@itcast.cn 官网:https://www.itcast.cn/" pattern = r'(\w+@[\w-]+\.\w+)|(https?://\S+)' for match in re.finditer(pattern, text): print(f"发现:{match.group()} 位置[{match.start()}-{match.end()}]") ``` #### 5. 分组提取数据 ```python log = "2023-08-15 14:22:45 [ERROR] 文件加载失败" pattern = r'(\d{4}-\d{2}-\d{2}).+?\[(\w+)\]\s+(.+)' match = re.match(pattern, log) print(f"日期:{match.group(1)}") print(f"级别:{match.group(2)}") print(f"内容:{match.group(3)}") ``` ### 最佳实践建议 1. 使用`r''`原始字符串避免转义问题 2. 复杂正则分段编写: ```python date_part = r'(\d{4}-\d{2}-\d{2})' time_part = r'(\d{2}:\d{2}:\d{2})' combined = f'{date_part} {time_part}' ``` 3. 性能优化:预编译常用正则 ```python phone_pattern = re.compile(r'\b1[3-9]\d{9}\b') phone_pattern.findall(text) ``` ### 学习资源推荐 1. [正则表达式可视化工具](https://regex101.com/) 2. Python官方`re`模块文档 3. 练习数据集:Apache访问日志、CSV文件处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值