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()` 适用于查找所有匹配项,并返回一个包含所有匹配项的列表。
posted @ 2023-07-25 01:29  鞭码形动  阅读(20)  评论(0编辑  收藏  举报