20个Python 正则表达式应用与技巧

这篇具有很好参考价值的文章主要介绍了20个Python 正则表达式应用与技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自华为云社区《Python 正则表达式大揭秘应用与技巧全解析》,作者:柠檬味拥抱。

Python 中的 re 模块是用于处理正则表达式的强大工具。正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式。在本文中,我们将探讨 Python 中 re 模块的应用和一些技巧,帮助您更好地理解和利用正则表达式。

1. 导入 re 模块

在开始之前,首先要确保已经导入了 re 模块:

import re

2. 使用 re 模块进行匹配

以下是一个简单的示例,演示如何使用 re 模块在字符串中查找特定模式的匹配项:

text = "The quick brown fox jumps over the lazy dog"

# 使用 re 模块查找匹配项
matches = re.findall(r'\b\w{3}\b', text)

print(matches)  # 输出匹配的单词列表

在上面的示例中,我们使用了 \b\w{3}\b 这个正则表达式来匹配长度为3的单词。\b 表示单词的边界,\w{3} 表示匹配三个字母字符。re.findall() 函数返回所有匹配的结果。

3. 使用分组

分组是正则表达式中的一个强大功能,它允许您对匹配的部分进行分组处理。以下是一个示例,演示如何使用分组从文本中提取出邮件地址:

text = "Contact us at: support@example.com, sales@example.com"

# 使用分组提取邮件地址
emails = re.findall(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})', text)

print(emails)  # 输出提取的邮件地址列表

在上面的示例中,([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}) 是一个匹配邮件地址的正则表达式。其中,() 将整个邮件地址作为一个分组,使得 re.findall() 函数只返回匹配的邮件地址部分。

4. 替换文本中的字符串

re 模块还提供了替换功能,允许您使用正则表达式来替换文本中的特定字符串。以下是一个示例,演示如何将文本中的所有数字替换为 “X”:

text = "There are 123 apples and 456 oranges"

# 使用 re.sub() 函数替换文本中的数字为 "X"
new_text = re.sub(r'\d+', 'X', text)

print(new_text)  # 输出替换后的文本

在上面的示例中,re.sub(r'\d+', 'X', text) 使用正则表达式 \d+ 匹配一个或多个数字,并将其替换为 “X”。

5. 使用编译的正则表达式

在处理大量文本时,编译正则表达式可以提高匹配效率。以下是一个示例,演示如何使用编译后的正则表达式进行匹配:

pattern = re.compile(r'\bpython\b', re.IGNORECASE)

text = "Python is a popular programming language"

# 使用编译后的正则表达式进行匹配
match = pattern.search(text)

if match:
    print("Found")
else:
    print("Not found")

在上面的示例中,re.compile() 函数编译了一个不区分大小写的正则表达式,并且使用 search() 方法进行匹配。

通过掌握以上技巧,您可以更加灵活和高效地使用 Python 中的 re 模块进行正则表达式的处理。正则表达式是一项强大的技能,在处理文本和字符串时非常有用。

6. 使用预定义字符类

正则表达式中有一些预定义的字符类,可以简化匹配特定类型字符的操作。以下是一些常用的预定义字符类及其示例用法:

  • \d:匹配任意数字字符。
  • \w:匹配任意字母、数字或下划线字符。
  • \s:匹配任意空白字符(空格、制表符、换行符等)。
text = "The code is 1234 and the password is abcd_123"

# 使用预定义字符类匹配数字和字母密码
codes = re.findall(r'\b\w+\b', text)

print(codes)  # 输出匹配的代码和密码列表

7. 使用量词

量词用于指定匹配字符或组的数量。以下是一些常用的量词及其示例用法:

  • *:匹配前一个字符零次或多次。
  • +:匹配前一个字符一次或多次。
  • ?:匹配前一个字符零次或一次。
  • {n}:匹配前一个字符恰好 n 次。
  • {n,}:匹配前一个字符至少 n 次。
  • {n,m}:匹配前一个字符至少 n 次,但不超过 m 次。
text = "The Python programming language is widely used for data analysis"

# 使用量词匹配至少包含两个字母的单词
words = re.findall(r'\b\w{2,}\b', text)

print(words)  # 输出匹配的单词列表

8. 使用锚点

锚点用于匹配字符串的边界,而不是实际的字符。以下是一些常用的锚点及其示例用法:

  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • \b:匹配单词的边界。
text = "Python is a great language for both beginners and experts"

# 使用锚点匹配以 Python 开头的句子
sentence = re.findall(r'^Python.*', text)

print(sentence)  # 输出匹配的句子

9. 贪婪与非贪婪匹配

在正则表达式中,量词默认是贪婪的,即它们会尽可能匹配最长的字符串。但有时候我们希望匹配最短的字符串,这时候就需要使用非贪婪匹配。在量词后面加上 ? 符号可以将其变为非贪婪匹配。

text = "Python is a powerful programming language"

# 使用贪婪匹配查找 "p""g" 之间的内容
greedy_match = re.findall(r'p.*g', text)

# 使用非贪婪匹配查找 "p""g" 之间的内容
non_greedy_match = re.findall(r'p.*?g', text)

print("贪婪匹配:", greedy_match)  # 输出贪婪匹配结果
print("非贪婪匹配:", non_greedy_match)  # 输出非贪婪匹配结果

10. 使用后向引用

后向引用允许您在正则表达式中引用先前匹配的内容。这在需要匹配重复的模式时非常有用。

text = "apple apple orange orange"

# 使用后向引用匹配重复的单词
duplicates = re.findall(r'(\b\w+\b) \1', text)

print("重复的单词:", duplicates)  # 输出匹配到的重复单词列表

11. 多行匹配

有时候我们需要匹配多行文本,而不仅仅是单行。这时可以使用 re.MULTILINE 标志来启用多行匹配模式。

text = """Python is a popular programming language.
It is used for web development, data analysis, and more.
Python has a simple syntax and is easy to learn."""

# 使用多行匹配模式匹配以大写字母开头的句子
sentences = re.findall(r'^[A-Z].*$', text, re.MULTILINE)

print("以大写字母开头的句子:", sentences)  # 输出匹配到的句子列表

12. 使用命名分组

在复杂的正则表达式中,为了增加可读性和维护性,可以使用命名分组来标识匹配的部分。

text = "John has 5 apples, Mary has 3 oranges"

# 使用命名分组提取人名和水果数量
matches = re.findall(r'(?P<name>\w+) has (?P<quantity>\d+) \w+', text)

for match in matches:
    print("Name:", match['name'], "- Quantity:", match['quantity'])

以上是一些高级技巧,可以进一步扩展您对正则表达式的应用和理解。通过不断练习和尝试,您将能够更灵活地应用正则表达式来解决各种文本处理问题。

13. 使用预搜索断言

预搜索断言允许您在匹配字符串时,指定字符串之前或之后的条件。它不会消耗匹配的字符,仅用于指定条件。

text = "apple banana orange grape"

# 使用预搜索断言匹配出包含 "apple" 之后的所有水果
result = re.findall(r'(?<=apple\s)(\w+)', text)

print("包含 'apple' 之后的水果:", result)  # 输出匹配到的水果列表

14. 使用肯定与否定预搜索断言

肯定预搜索断言 (?=...) 匹配满足条件的字符串,而否定预搜索断言 (?!) 匹配不满足条件的字符串。

text = "Python is a powerful programming language"

# 使用肯定预搜索断言匹配包含 "is" 的单词
positive_result = re.findall(r'\b\w+(?= is\b)', text)

# 使用否定预搜索断言匹配不包含 "is" 的单词
negative_result = re.findall(r'\b\w+(?! is\b)', text)

print("肯定预搜索断言:", positive_result)  # 输出匹配到的单词列表
print("否定预搜索断言:", negative_result)  # 输出匹配到的单词列表

15. 使用 re.finditer() 函数

re.finditer() 函数与 re.findall() 函数类似,但它返回一个迭代器,可以逐个访问匹配对象。

text = "Python is a powerful programming language"

# 使用 re.finditer() 函数匹配所有单词
matches_iter = re.finditer(r'\b\w+\b', text)

for match in matches_iter:
    print(match.group())  # 输出匹配到的单词

16. 使用 re.split() 函数

除了匹配和查找文本模式,re 模块还提供了 re.split() 函数,用于根据正则表达式模式拆分字符串。

text = "apple,banana,orange,grape"

# 使用 re.split() 函数根据逗号拆分字符串
fruits = re.split(r',', text)

print("拆分后的水果列表:", fruits)  # 输出拆分后的水果列表

17. 使用 re.sub() 函数的替换函数参数

re.sub() 函数的第二个参数可以是一个函数,用于处理匹配的结果后再替换。

def double(match):
    return str(int(match.group(0)) * 2)

text = "The numbers are 1, 2, 3, and 4"

# 使用替换函数参数将所有数字乘以2
new_text = re.sub(r'\d+', double, text)

print("替换后的文本:", new_text)  # 输出替换后的文本

18. 使用 re.fullmatch() 函数

re.fullmatch() 函数用于检查整个字符串是否完全匹配给定的模式。

pattern = re.compile(r'\d{4}-\d{2}-\d{2}')

date1 = "2022-01-15"
date2 = "15-01-2022"

# 使用 re.fullmatch() 函数检查日期格式
match1 = pattern.fullmatch(date1)
match2 = pattern.fullmatch(date2)

if match1:
    print("日期格式正确")
else:
    print("日期格式错误")

if match2:
    print("日期格式正确")
else:
    print("日期格式错误")

19. 使用 re.IGNORECASE 标志进行不区分大小写匹配

在编译正则表达式时,可以使用 re.IGNORECASE 标志来进行不区分大小写的匹配。

pattern = re.compile(r'python', re.IGNORECASE)

text = "Python is a powerful programming language"

# 使用不区分大小写匹配模式查找 "Python"
match = pattern.search(text)

if match:
    print("Found")
else:
    print("Not found")

20. 使用 re.DEBUG 标志进行正则表达式调试

在编译正则表达式时,可以使用 re.DEBUG 标志来输出正则表达式的调试信息,以便更好地理解它的工作原理。

pattern = re.compile(r'\b\w{3}\b', re.DEBUG)

text = "The quick brown fox jumps over the lazy dog"

# 输出编译后的正则表达式调试信息
pattern.findall(text)

通过继续学习和实践这些高级的正则表达式技巧,您将能够更好地应用正则表达式来处理各种文本匹配和处理任务,提高代码的效率和可维护性。正则表达式是 Python 中强大而灵活的工具之一,对于处理字符串模式非常有用。

总结

通过本文的介绍,我们探索了 Python 中 re 模块的应用与技巧,使您能够更灵活和高效地处理正则表达式。我们从基础的模式匹配开始,介绍了如何使用 re 模块进行匹配、分组、替换等操作。随后,我们深入探讨了一些高级技巧,包括贪婪与非贪婪匹配、后向引用、多行匹配、预搜索断言等,这些技巧可以帮助您更好地处理复杂的文本处理任务。此外,我们还介绍了一些实用的函数和标志,如 re.split()re.sub() 的替换函数参数、re.fullmatch()re.IGNORECASEre.DEBUG 等,使您能够更灵活地应用正则表达式解决实际问题。

掌握正则表达式是 Python 编程中非常重要的一部分,它能够帮助我们更快地处理字符串模式匹配、文本提取等任务,提高代码的效率和可维护性。通过不断学习和实践,您将能够更深入地理解和应用正则表达式,解决各种文本处理问题,提升自己在 Python 编程中的技能水平。希望本文对您有所帮助,欢迎继续探索和学习更多关于正则表达式的知识。

点击关注,第一时间了解华为云新鲜技术~

 文章来源地址https://www.toymoban.com/news/detail-848697.html

到了这里,关于20个Python 正则表达式应用与技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从零学习python 】65. Python正则表达式修饰符及其应用详解

    修饰符 描述 re.I 使匹配对大小写不敏感 re.M 多行匹配,影响 ^ 和 $ re.S 使 . 匹配包括换行在内的所有字符 示例代码如下: 以上是关于正则表达式修饰符的介绍和示例。修饰符可以根据需要来调整正则表达式的匹配方式,从而更加灵活地处理字符串匹配问题。使用合适的修饰

    2024年02月11日
    浏览(53)
  • 正则表达式应用

    正则匹配以{开头,以}结尾 正则匹配以[开头,以]结尾 校验数字的表达式 数字: ^[0-9]*$ n位的数字: ^d{n}$ 至少n位的数字: ^d{n,}$ m-n位的数字: ^d{m,n}$ 零和非零开头的数字: ^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字: ^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1-2位小数的正数或负

    2024年02月11日
    浏览(42)
  • 正则表达式应用场景

    数据验证应该是正则表达式最常见的场景了,经常用于用户的输入是否符合所需的条件。数据验证可确保输入或导入的数据准确、一致,并符合预定义的规则。 验证手机号: 验证邮箱: 验证密码(要求:至少包含一个数字,一个字母,一个特殊字符,长度在8~18之间): 验

    2024年02月08日
    浏览(45)
  • Python正则表达式之学习正则表达式三步曲

            正则表达式描述了一种字符串匹配的模式,可以用来检查一个串的有无某子串,或者做子串匹配替换,取出子串等操作。也可以说正则表达式就是字符串的匹配规则,也可以理解为是一种模糊匹配,匹配满足正则条件的字符串。         1、数据验证(eg:表单验

    2024年02月15日
    浏览(66)
  • 02_正则表达式的应用

    理解正则表达式概述 掌握Js的正则对象Regexp 掌握正则表达式的常见用法 完成页面注册的手机号码校验 1. 正则表达式概述 官方文档:正则表达式 - JavaScript | MDN 正则表达式在线测试 1.1 正则表达式的定义 介绍:正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中,

    2024年01月24日
    浏览(38)
  • 老夫的正则表达式大成了,桀桀桀桀!!!【Python 正则表达式笔记】

    特殊字符 .^$?+*{}[]()| 为特殊字符,若想要使用字面值,必须使用 进行转义 字符类 [] [] 匹配包含在方括号中的任何字符。它也可以指定范围,例: [a-zA-Z0-9] 表示a到z,A到Z,0到9之间的任何一个字符 [u4e00-u9fa5] 匹配 Unicode 中文 [^x00-xff] 匹配双字节字符(包括中文) 在 [] 中

    2024年02月04日
    浏览(60)
  • 关于正则表达式中?=、?!、?<=、?<!、?:的理解与应用

    (?=pattern) :正向先行断言,表示匹配位置后面必须紧跟着满足 pattern 的字符串,但不包括这个字符串在匹配结果中。 (?!pattern) :负向先行断言,表示匹配位置后面不能紧跟着满足 pattern 的字符串,也不包括这个字符串在匹配结果中。 (?=pattern) :正向后行断言,表示匹配位置

    2024年02月09日
    浏览(46)
  • 机器学习与数据科学-专题1 Python正则表达式-【正则表达式入门-1】

    为了完成本关任务,你需要掌握: 在 Python 中使用正则表达式; 最基础正则表达式; 正则匹配函数。 在 Python 中使用正则表达式 正可谓人生苦短,我用 Python。Python 有个特点就是库非常多,自然拥有正则匹配这种常见的库,并且此库已经嵌入在 Python 标准库中,使用起来非常

    2024年01月22日
    浏览(64)
  • python正则表达式-正则基础

    目录 一、任一元素 二、匹配特定的字符类别          1、d  w 三、多个元素          1、两位元素 [][]          2、* + ?          3、重复次数 {}          4、位置匹配 ^ $          5、子表达式()         []:1、[ab] 匹配a或b;        2、[0-9] 匹配任意一个数

    2024年02月05日
    浏览(46)
  • python 正则表达式

    2024年01月17日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包