0%

Python3 模式匹配:从基础到高级的匹配技巧

模式匹配是 Python 中处理数据结构和文本的重要技术,从简单的字符串匹配到复杂的结构化数据匹配都有广泛应用。Python 3 提供了多种模式匹配工具,包括基础的字符串方法、re 模块的正则表达式,以及 Python 3.10 引入的结构化模式匹配(match-case 语句)。本文将系统介绍这些技术,帮助你高效处理各类匹配场景。

基础字符串模式匹配

Python 字符串内置了多种方法,可直接用于简单的模式匹配需求,无需引入额外模块。

1. 子串检查(包含性匹配)

  • in 运算符:检查子串是否存在于字符串中
  • str.find(sub):返回子串首次出现的索引(未找到返回 -1)
  • str.count(sub):统计子串出现的次数
1
2
3
4
5
6
7
8
9
10
11
12
13
s = "hello world, hello python"

# 检查是否包含子串
print("hello" in s) # True
print("java" in s) # False

# 查找子串位置
print(s.find("hello")) # 0(首次出现)
print(s.find("hello", 5)) # 13(从索引5开始查找)

# 统计出现次数
print(s.count("hello")) # 2
print(s.count("l")) # 5

2. 前缀 / 后缀匹配

  • str.startswith(prefix):检查字符串是否以指定前缀开头
  • str.endswith(suffix):检查字符串是否以指定后缀结尾
阅读全文 »

Python3 字符串操作详解:从基础到高级技巧

字符串是 Python 中最常用的数据类型之一,用于表示文本信息。Python 提供了丰富的字符串操作方法,从基础的拼接、切片到高级的正则匹配,覆盖了几乎所有文本处理场景。本文系统讲解 Python3 字符串的核心操作,帮助你高效处理文本数据。

字符串基础:定义与特性

1. 字符串定义

Python 中字符串可以用单引号(')、双引号(")或三引号('''""")定义,三引号可用于多行字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 单引号定义
str1 = 'Hello Python'

# 双引号定义(与单引号无本质区别)
str2 = "Hello Python"

# 三引号定义多行字符串
str3 = '''第一行
第二行
第三行'''

print(str3)
# 输出:
# 第一行
# 第二行
# 第三行

2. 字符串特性

  • 不可变性:字符串创建后不能修改单个字符(修改会创建新字符串)

    1
    2
    s = "hello"
    # s[0] = 'H' # 报错:'str' object does not support item assignment
  • 序列类型:字符串是字符的序列,支持索引([])和切片([:])操作

  • 可迭代性:可直接用 for 循环遍历每个字符

基础操作:拼接、重复与转换

1. 字符串拼接

  • 使用 + 运算符拼接字符串(仅能拼接字符串类型)
  • 使用 ,print() 中拼接(会自动添加空格)
  • 使用 * 重复字符串
阅读全文 »

Python 3 循环详解:for 循环、while 循环与实战技巧

循环是编程中用于 “重复执行一段代码” 的核心语法,Python 3 提供两种主流循环结构:for 循环(适合 “已知循环次数或遍历序列” 场景)和 while 循环(适合 “未知循环次数,依赖条件判断” 场景)。本文从 “基础语法→进阶用法→循环控制→实战案例” 四个维度,系统讲解 Python 3 循环的使用方法,帮你高效处理重复逻辑。

for 循环:遍历序列或可迭代对象

for 循环的核心是 “遍历”—— 按顺序获取可迭代对象(如列表、字符串、字典)中的每个元素,执行对应代码块,直到所有元素处理完毕。

1. 基础语法

1
2
3
4
5
6
for 变量名 in 可迭代对象:
# 每次遍历获取一个元素,赋值给“变量名”,执行代码块
代码语句1
代码语句2
# 循环结束后,执行后续代码
后续代码
关键概念:
  • 可迭代对象:能被for循环遍历的对象,常见类型包括:
    • 序列:列表(list)、字符串(str)、元组(tuple);
    • 集合:集合(set)、字典(dict,默认遍历键);
    • 其他:range 对象(生成整数序列)、文件对象等。
  • 缩进:循环体内的代码必须缩进(推荐 4 个空格),缩进不一致会报 IndentationError

2. 常见遍历场景

场景 1:遍历列表(list)
阅读全文 »

Python 条件判断详解:语法、逻辑与实战示例

条件判断是编程中的核心逻辑之一,用于根据 “条件是否成立” 执行不同代码块。Python 中通过 ifelifelse 关键字实现条件判断,语法简洁且逻辑清晰。本文从 “基础语法→多条件判断→嵌套判断→实战场景” 四个维度,系统讲解 Python 条件判断的使用方法,帮你掌握不同场景下的逻辑编写技巧。

基础语法:if 语句(单条件判断)

if 是 Python 条件判断的基础,用于判断 “一个条件” 是否成立:若条件为 True(真),执行缩进的代码块;若为 False(假),则跳过该代码块。

1. 语法格式

1
2
3
4
5
6
if 条件表达式:
# 条件成立时执行的代码(必须缩进,通常用 4 个空格)
代码语句1
代码语句2
# 条件不成立时,跳过缩进块,执行后续代码
后续代码
关键说明:
  • 条件表达式:结果必须是 “布尔值”(True或False),常见形式包括:
    • 比较运算(><==!=>=<=);
    • 逻辑运算(andornot);
    • 成员运算(innot in);
    • 身份运算(isis not)。
  • 冒号(:if 语句结尾必须加冒号,用于标记 “代码块的开始”。
  • 缩进:Python 通过缩进区分代码块(推荐 4 个空格),缩进不一致会报错(IndentationError)。

2. 示例:判断数字大小

阅读全文 »

多触发策略组合问题解析:Cron 与 TimeBased 是否会重复触发

1
2
3
4
5
<Policies>
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="1024 MB"/>
</Policies>

<Policies> 同时包含了 CronTriggeringPolicyTimeBasedTriggeringPolicySizeBasedTriggeringPolicy,核心疑问是 “0 点时是否会触发两个策略(Cron 和 TimeBased)”。下面从 Log4j2 多策略执行逻辑、两种时间相关策略的差异入手,详细分析问题并给出优化建议。

多触发策略的核心执行逻辑

Log4j2 的 <Policies>组合触发策略(CompositeTriggeringPolicy),其核心规则是:
只要任意一个策略满足触发条件,就会立即执行日志滚动,且后续策略不再判断(即 “短路执行”,类似if-else的逻辑,而非 “所有满足条件的策略都执行”)。

具体流程如下:

  1. 日志写入时,Log4j2 按 <Policies> 中策略的配置顺序依次检查;
  2. 若第一个策略(如CronTriggeringPolicy)满足条件,则触发滚动,跳过后续策略;
  3. 若第一个策略不满足,再检查第二个(如TimeBasedTriggeringPolicy),以此类推;
  4. SizeBasedTriggeringPolicy 会在每次日志写入时检查文件大小,若达到阈值,无论其他策略是否满足,都会优先触发滚动。

0 点时的策略触发分析

配置中,CronTriggeringPolicy(0 点触发)和 TimeBasedTriggeringPolicy(默认按天触发)在 “0 点” 这个时间点看似都满足条件,但实际不会重复触发,原因如下:

1. 两种时间策略的本质差异

虽然两者都与 “时间” 相关,但触发逻辑和依赖条件完全不同:

策略 触发逻辑 依赖配置 执行方式
CronTriggeringPolicy 基于 Cron 表达式的定时任务,内部启动独立线程,到时间后主动标记 “需要滚动” schedule(Cron 表达式) 主动触发(与日志写入无关)
TimeBasedTriggeringPolicy 基于 filePattern 时间粒度,日志写入时检查当前时间是否超出粒度范围 filePattern(如%d{yyyyMMdd} 被动触发(依赖日志写入)

2. 0 点时的实际执行场景

阅读全文 »