Python高级正则表达式

本文深入讲解Python的正则表达式,包括查找所有匹配的子串、交替、编译正则表达式以及使用正则表达式进行字符串拆分和搜索替换。通过实例解析正则表达式的高级用法,适合Python开发者提升正则技能。

介绍

 

使用 Python 通往成功的阶梯

在我们教程的正则表达式介绍中,我们已经介绍了正则表达式的基本原理。我们已经展示了最简单的正则表达式的样子。我们还学习了如何通过使用 re 模块的 search() 和 match() 方法在 Python 中使用正则表达式。制定和使用字符类的概念,以及预定义的字符类,如 \d、\D、\s、\S 等,现在应该是众所周知的。您一定已经学会了如何使用正则表达式匹配字符串的开头和结尾。您必须知道问号的特殊含义才能使项目可选。我们还引入了量词来任意或在特定范围内重复字符和组。

您还必须熟悉分组的使用以及反向引用的语法和用法。

此外,我们已经解释了 re 模块的匹配对象及其包含的信息,以及如何使用 span()、start()、end() 和 group() 方法检索这些信息。

介绍以一个全面的 Python 示例结束。

在本章中,我们将继续解释正则表达式的语法。我们还将解释 Python 模块 re 的更多方法。例如,如何查找正则表达式的所有匹配子字符串。一项需要使用其他编程语言(如 Perl 或 Java)编程的任务,但可以通过调用 Python 的 re 模块的一个方法来处理。到目前为止,我们只知道如何使用字符类定义字符选择。我们将在教程的本章中演示如何制定子串的交替,

查找所有匹配的子串

Python 模块 re 提供了另一种很棒的方法,这是 Perl 和 Java 等其他语言不提供的。如果要查找字符串中与正则表达式匹配的所有子字符串,则必须在 Perl 和其他语言中使用循环,如下面的 Perl 片段所示:

而 ($string =~ m/regex/g) {
  打印“找到 '$&'。下一次尝试字符”。pos($string)+1 。"\n";
}

在 Python 中要容易得多。无需循环。我们可以使用 re 模块的 findall 方法:

 re.findall(模式,字符串[,标志]) 

findall 返回字符串中模式的所有非重叠匹配项,作为字符串列表。从左到右扫描字符串,并按照找到的顺序返回匹配项。

t = "肥猫不吃燕麦,但老鼠吃蝙蝠。" = 重新findall ( "[force]at" ,  t )
打印( mo )

输出:

['脂肪', '猫', '吃', '燕麦', '老鼠', '吃']

如果模式中存在一个或多个组, findall 将返回一个组列表。如果模式有多个组,这将是一个元组列表。我们将在下一个示例中演示这一点。我们有一个很长的字符串,其中包含各种 Python 培训课程及其日期。第一次调用 findall 时,我们不使用任何分组并因此接收完整的字符串。在下一次调用中,我们使用分组并 findall 返回一个 2 元组列表,每个元组将课程名称作为第一个组成部分,将日期作为第二个组成部分:

进口 重新
课程 =  “Python的训练课程初学者:15/8/2011 - 19/8/2011; Python的培训课程中间体:12 / DEC / 2011 - 16 / DEC / 2011; Python的文本处理场:31月/ 10月/ 2011 - 4/Nov/2011" 
items  =  re findall ( "[^:]*:[^;]*;?" , 课程)
项目

输出:

['Python 初学者培训课程:15/Aug/2011 - 19/Aug/2011;',
 'Python 培训课程中级:12/Dec/2011 - 16/Dec/2011;',
 'Python 文本处理课程:31/Oct/2011 - 4/Nov/2011']
项目 = 重新findall ( "([^:]*):([^;]*;?)" , 课程)
项目

输出:

[('Python 初学者培训课程', '15/Aug/2011 - 19/Aug/2011;'),
 (“Python 培训课程中级”,“2011 年 12 月 12 日 - 2011 年 12 月 16 日;”),
 (“Python 文本处理课程”,“2011 年 10 月 31 日 - 2011 年 11 月 4 日”)]

交替

在我们对正则表达式的介绍中,我们介绍了字符类。字符类提供一组字符中的一个选择。有时我们需要在几个正则表达式之间进行选择。这是一个逻辑“或”,这就是为什么这个结构的符号是“|” 象征。在以下示例中,我们检查伦敦、巴黎、苏黎世、康斯坦茨伯尔尼或斯特拉斯堡中的一个城市是否出现在以“location”一词开头的字符串中:

import  re 
### 高级正则表达式教程 Python 的 `re` 模块提供了强大的工具来处理复杂的模式匹配和字符串操作。以下是关于 Python高级正则表达式的详细介绍。 #### 正则表达式基础回顾 在学习高级功能之前,了解基本概念至关重要。正如提到的那样,正则表达式的核心在于字符匹配[^1]。通过逐步构建更复杂的功能,可以实现诸如分组、反向引用以及条件匹配等功能。 #### 分组与捕获 分组允许将多个部分组合在一起作为一个单元进行匹配,并可以通过括号 `( )` 来定义这些组。例如: ```python import re pattern = r"(ab)+" text = "abababc" matches = re.findall(pattern, text) print(matches) # Output: ['abab'] ``` 这里,`(ab)` 被视为一组并重复至少一次[^3]。 #### 反向引用 当需要引用前面已经捕获的内容时,可以使用反向引用 `\n` (其中 n 是组编号),这有助于验证某些特定结构是否存在两次或者更多次相同的子串。 ```python pattern_with_backref = r"(\b\w+)\s+\1" example_text = "hello hello world" result = re.search(pattern_with_backref, example_text) if result: print(f'Match found: {result.group()}') # Match found: hello hello else: print('No match') ``` 此代码片段寻找两个连续相同单词的情况[^2]。 #### 条件语句 (?=...) 和 (?!...) 零宽断言使得我们可以在不消耗任何输入的情况下测试某个位置前后的状态。肯定前瞻 `(?=...)` 表示后面应该有指定模式;否定前瞻 `(?!...)` 则表示后面不应该存在该模式。 ```python positive_lookahead_pattern = r"\d+(?= dollars)" negative_lookbehind_pattern = r"(?<!not )allowed" sample_string_for_positive = "I have 50 dollars." sample_string_for_negative = "This is allowed." pos_match = re.search(positive_lookahead_pattern, sample_string_for_positive) neg_match = re.search(negative_lookbehind_pattern, sample_string_for_negative) print(pos_match.group() if pos_match else "Not matched") # Outputs: 50 print(neg_match.group() if neg_match else "Not matched") # Outputs: allowed ``` 以上展示了如何利用前瞻/后顾来进行更加精确的位置控制[^4]。 #### 自定义标志位设置 除了标准选项外,还可以自定义一些行为比如忽略大小写(`IGNORECASE`) 或多行模式 (`MULTILINE`) 等等。 ```python case_insensitive_search = re.compile(r'word', flags=re.IGNORECASE).search('Word') multiline_example = re.compile('^line$', flags=re.MULTILINE).findall('''first line\nsecond line''') print(bool(case_insensitive_search)) # True print(multiline_example) # ['line', 'line'] ``` 这种灵活性让开发者能够针对不同场景调整其解析逻辑[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值