Python常用异常处理
Python常用异常处理
- 自定义异常处理接口返回值
-- for循环处理接口数据
假定匹配接口里的 手机号码,将自定义异常丢入想要数据里列表。
import re
def process_data(data_list):
list_str = []
for data in data_list:
try:
# 使用正则表达式匹配手机号码,以1开头,后面跟着10个数字
pattern = r'^1\d{10}$'
if re.match(pattern, data):
# 如果数据符合手机号码的匹配规则,将其添加到 list_str 列表中
list_str.append(data)
else:
# 如果数据不是手机号码,抛出自定义异常
raise ValueError("这个数据不是手机号码")
except ValueError as ve:
# 捕获自定义异常,并将异常信息添加到 list_str 列表中
list_str.append(str(ve))
return list_str
# 测试数据
data_list = ["15812345678", "13298765432", "12345678900", "18888888888", "hello world"]
result_list = process_data(data_list)
print(result_list)
按照异常处理的标准写法 处理上述问题
import re
def process_data(data_list):
list_str = []
for data in data_list:
try:
# 使用正则表达式匹配手机号码,以1开头,后面跟着10个数字
pattern = r'^1\d{10}$'
if re.match(pattern, data):
# 如果数据符合手机号码的匹配规则,将其添加到 list_str 列表中
list_str.append(data)
else:
# 如果数据不是手机号码,抛出自定义异常
raise ValueError("这个数据不是手机号码")
except ValueError as ve:
# 捕获自定义异常,并将异常信息添加到 list_str 列表中
list_str.append(str(ve))
else:
# 没有异常发生时执行的代码
# 这里可以放一些处理成功情况的逻辑
pass
finally:
# 无论是否发生异常,都会执行的代码
# 这里可以放一些清理工作的逻辑
pass
return list_str
# 测试数据
data_list = ["15812345678", "13298765432", "12345678900", "18888888888", "hello world"]
result_list = process_data(data_list)
print(result_list)
正则匹配中的所有规则
正则表达式规则和用法
在 Python 语言中,正则表达式的功能由 `re` 模块提供。以下是在 Python 中使用正则表达式的一些常见规则和解释:
1. `re.compile(pattern)`
- 解释:用于将正则表达式的字符串模式编译成正则对象,以便后续复用匹配。
- 示例:`pattern = re.compile(r'\d{3}-\d{2}-\d{4}')`
2. 字符匹配:
- `.`:匹配任意一个字符(除了换行符)。
- `\d`:匹配任意数字,等同于`[0-9]`。
- `\D`:匹配任意非数字字符,等同于`[^0-9]`。
- `\w`:匹配任意字母、数字或下划线,等同于`[a-zA-Z0-9_]`。
- `\W`:匹配任意非字母、数字或下划线字符,等同于`[^a-zA-Z0-9_]`。
- `\s`:匹配任意空白字符,包括空格、制表符、换行符等。
- `\S`:匹配任意非空白字符。
3. 重复匹配:
- `*`:匹配前面的字符零次或多次。
- `+`:匹配前面的字符一次或多次。
- `?`:匹配前面的字符零次或一次。
- `{m}`:匹配前面的字符恰好出现 m 次。
- `{m, n}`:匹配前面的字符出现 m 到 n 次。
4. 特殊字符:
- `^`:匹配字符串的开始位置。
- `$`:匹配字符串的结束位置。
- `\b`:匹配单词的边界。
5. 分组和捕获:
- `()`:创建一个匹配组,用于对子表达式进行分组。
- `(?P<name>pattern)`:创建一个命名捕获组。
- `(?P=name)`:引用前面命名捕获组匹配到的内容。
6. 选择符:
- `|`:用于在多个模式中选择一个匹配。
7. 边界匹配:
- `\b`:匹配单词边界。
8. 模式修饰符:
- `re.I`:忽略大小写匹配。
- `re.M`:多行匹配。
- `re.S`:让 `.` 匹配任意字符,包括换行符。
- `re.X`:忽略模式中的空白和注释。
- `re.A`:ASCII 匹配模式。
示例:
```python
import re
pattern = re.compile(r'\d{3}-\d{2}-\d{4}')
result = pattern.match('123-45-6789')
if result:
print("匹配成功")
else:
print("匹配失败")
```
以上是一些在 Python 中常见的正则表达式规则和用法。使用 `re` 模块时,需要根据具体的需求和字符串模式来灵活使用这些规则。
search()和findall的区别。
`search()` 和 `findall()` 是 Python `re` 模块中用于正则表达式匹配的两个常用函数,它们之间有以下区别:
1. 功能不同:
- `search()`: 在给定的字符串中搜索第一个匹配项,并返回一个 `match` 对象。如果找到匹配项,返回的 `match` 对象可以用于获取匹配的内容和位置信息。如果未找到匹配项,则返回 `None`。
- `findall()`: 在给定的字符串中找到所有匹配项,并以列表形式返回所有匹配项。返回的是匹配的实际内容,而不是 `match` 对象。
2. 返回值不同:
- `search()`: 返回第一个匹配项的 `match` 对象,或者返回 `None`。
- `findall()`: 返回一个包含所有匹配项的列表,如果未找到匹配项则返回空列表。
3. 使用场景不同:
- `search()`: 适用于需要找到第一个匹配项并对其进行操作的情况。例如,可以通过 `group()` 方法获取匹配项的具体内容,或者通过 `start()` 和 `end()` 方法获取匹配项在原始字符串中的起始和结束位置。
- `findall()`: 适用于需要找到所有匹配项的情况。返回的列表中包含了所有匹配项的内容,可以直接对这个列表进行处理或分析。
示例:
```python
import re
pattern = re.compile(r'\d+')
text = "Hello 123 World 456"
# 使用 search() 找到第一个匹配项
result_search = pattern.search(text)
if result_search:
print("search() 找到匹配项:", result_search.group())
else:
print("search() 未找到匹配项")
# 使用 findall() 找到所有匹配项
result_findall = pattern.findall(text)
if result_findall:
print("findall() 找到匹配项:", result_findall)
else:
print("findall() 未找到匹配项")
```
输出:
```
search() 找到匹配项: 123
findall() 找到匹配项: ['123', '456']
```
总结:
- `search()` 适用于查找第一个匹配项,并且返回的是 `match` 对象。
- `findall()` 适用于查找所有匹配项,并返回一个包含所有匹配项的列表。