Python正则表达式一文详解+实例代码展示(下)

简介: Python正则表达式一文详解+实例代码展示(下)

三.正则表达式语法匹配


正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。


待会我们会用到re库中的函数还进行字符匹配,这里可以通过一个例子先看一下语法:

import re
a = "abbbbbccccd"
b = re.findall('ab+c+d',a)
print(b)

['abbbbbccccd']

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。


正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。


1 普通字符


普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。


1.1alone


普通字符串,上述例子基本用的都是普通字符串。这里我们用findall()函数来演示更好:

strings='Fanstuck wants to leave alone alonely'
print(re.findall('alone',strings))

['alone', 'alone']


1.2[alone]


匹配 [...] 中的所有字符:

strings='Fanstuck wants to leave alone alonely'
print(re.findall('[alone]',strings))

['a', 'n', 'a', 'n', 'o', 'l', 'e', 'a', 'e', 'a', 'l', 'o', 'n', 'e', 'a', 'l', 'o', 'n', 'e', 'l']


1.3[^alone]


匹配除了 [^...] 中字符的所有字符

strings='Fanstuck wants to leave alone alonely'
print(re.findall('[^alone]',strings))

['F', 'u', 'c', 'k', ' ', ' ', 'o', ' ', 'l', 'e', 'v', 'e', ' ', 'l', 'o', 'e', ' ', 'l', 'o', 'e', 'l', 'y']


1.4[A-Z]


[A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。


strings='Fanstuck wants to leave alone alonely'
print(re.findall('[^A-F]',strings))

['a', 'n', 's', 't', 'u', 'c', 'k', ' ', 'w', 'a', 'n', 't', 's', ' ', 't', 'o', ' ', 'l', 'e', 'a', 'v', 'e', ' ', 'a', 'l', 'o', 'n', 'e', ' ', 'a', 'l', 'o', 'n', 'e', 'l', 'y']


1.5 .


匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('.',strings))


['F', 'a', 'n', 's', 't', 'u', 'c', 'k', ' ', 'w', 'a', 'n', 't', 's', ' ', 't', 'o', ' ', 'l', 'e', 'a', 'v', 'e', ' ', 'a', 'l', 'o', 'n', 'e', ' ', 'a', 'l', 'o', 'n', 'e', 'l', 'y']


1.6[\s\S]


匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('[\s\S]',strings))

['F', 'a', 'n', 's', 't', 'u', 'c', 'k', ' ', 'w', 'a', 'n', 't', 's', ' ', 't', 'o', ' ', 'l', 'e', 'a', 'v', 'e', ' ', 'a', 'l', 'o', 'n', 'e', ' ', 'a', 'l', 'o', 'n', 'e', 'l', 'y']


1.7\w


匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

strings='Fanstuck wants to leave alone alonely'
print(re.findall('\w',strings))

['F', 'a', 'n', 's', 't', 'u', 'c', 'k', 'w', 'a', 'n', 't', 's', 't', 'o', 'l', 'e', 'a', 'v', 'e', 'a', 'l', 'o', 'n', 'e', 'a', 'l', 'o', 'n', 'e', 'l', 'y']


2.非打印字符


非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:


2.1\cx


匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。


2.2\f


匹配一个换页符。等价于 \x0c 和 \cL。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('\f',strings))


2.3\n


匹配一个换行符。等价于 \x0a 和 \cJ。

strings='Fanstuck \n \
        wants to leave \
        alone alonely'
print(re.findall('\n',strings))
print(strings)

['\n']

Fanstuck  

        wants to leave         alone alonely


2.4\r


匹配一个回车符。等价于 \x0d 和 \cM。

strings='\r Fanstuck \r \
        wants to leave\r \
        alone alonely'
print(re.findall('\r',strings))
print(strings)


['\r', '\r', '\r']

        alone alonelye


2.5 \s


匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('\s',strings))

[' ', ' ', ' ', ' ', ' ']


2.6\S


匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。


strings='Fanstuck wants to leave alone alonely'
print(re.findall('\S',strings))

['F', 'a', 'n', 's', 't', 'u', 'c', 'k', 'w', 'a', 'n', 't', 's', 't', 'o', 'l', 'e', 'a', 'v', 'e', 'a', 'l', 'o', 'n', 'e', 'a', 'l', 'o', 'n', 'e', 'l', 'y']


2.7\t


匹配一个制表符。等价于 \x09 和 \cI。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('\t',strings))

没写啥制表符固为空。


2.8\v


匹配一个垂直制表符。等价于 \x0b 和 \cK。


3.特殊字符


所谓特殊字符,就是一些有特殊含义的字符,如上面说的 runoo*b 中的 *,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 \,runo\*ob 匹配字符串 runo*ob。


许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:


3.1$


匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。


strings='Fanstuck wants to leave alone alonely'
print(re.findall(' alone alonely$',strings))

[' alone alonely']


3.2( )


标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用

strings='Fanstuck wants to leave alone alonely'
print(re.findall('(Fan\w{2,3}ck)',strings))


['Fanstuck']


3.3*

匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('(Fan\w*ck)',strings))

['Fanstuck']

3.4+


匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。


strings='Fanstuck wants to leave alone alonely'
print(re.findall('(alone)+',strings))


['alone', 'alone']


3.5.


匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('Fa.s.u.k',strings))

['Fanstuck']


3.6[


标记一个中括号表达式的开始。要匹配 [,请使用 \[。


3.7?


匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。


这里要注意一下贪婪模式和非贪婪模式。

贪婪模式:尽可能多的去匹配数据,表现为\w后面加某个元字符,例如\w*:


strings='Fanstuck wants to leave alone alonely'
print(re.findall('F\w*',strings))


['Fanstuck']


非贪婪模式:尽可能少的去匹配数据,表现为\w后面加?,例如\w?


strings='Fanstuck wants to leave alone alonely'
print(re.findall('F\w?',strings))

['Fa']


3.8\


将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。


3.9^


^有两种意义,一个是标识开头,一个是内容取反

^作为标识开头

strings='alone alonely'
print(re.findall('^alone',strings))

['alone']

^作为内容取反

[^x]            匹配除了x以外的任意字符

[^aeiou]        匹配除了aeiou这几个字母以外的任意字符


3.10{

标记限定符表达式的开始。要匹配 {,请使用 \{。


3.11|


指明两项之间的一个选择。要匹配 |,请使用 \|。


4.限定符


限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

正则表达式的限定符有:


4.1*


上述已作展示


4.2+


上述已作展示


4.3?


上述已作展示


4.4{n}


n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('Fan\w{2}uck',strings))

4.5 {n,}


n 是一个非负整数。至少匹配n 次。贪婪

strings='Fanstuck wants to leave alone alonely'
print(re.findall('Fan\w{1,}uck',strings))


['Fanstuck']


4.6 {n,m}


m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。贪婪

strings='Fanstuck wants to leave alone alonely'
print(re.findall('^(\w{2,8}\s*\w{2,8})+',strings))a

['Fanstuck wants']


1. strings='Fanstuck wants to leave alone alonely'
2. print(re.findall('^Fanstuck[(\w{2,8}\s*)+]+ly',strings))


['Fanstuck wants to leave alone alonely']


* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。


5.定位符

5.1^

上述已经演示

5.2$

上述已经演示

5.3\b

匹配一个单词边界,即字与空格间的位置。

strings='Fanstuck wants to leave alone alonely'
print(re.findall(r'\balone\b',strings))


['alone']


5.4\B


和 ’/b’ 相反,它只匹配非边界的字符。

strings='Fanstuck wants to leave alone alonely'
print(re.findall('alone\\Bly',strings))


['alonely']

目录
相关文章
|
22天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
31 6
|
1月前
|
存储 缓存 测试技术
Python中的装饰器:功能增强与代码复用的利器
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者以简洁优雅的方式增强函数或方法的功能。本文将深入探讨装饰器的定义、工作原理、应用场景以及如何自定义装饰器。通过实例演示,我们将展示装饰器如何在不修改原有代码的基础上添加新的行为,从而提高代码的可读性、可维护性和复用性。此外,我们还将讨论装饰器在实际应用中的一些最佳实践和潜在陷阱。
|
1月前
|
人工智能 数据挖掘 Python
Python编程基础:从零开始的代码旅程
【10月更文挑战第41天】在这篇文章中,我们将一起探索Python编程的世界。无论你是编程新手还是希望复习基础知识,本文都将是你的理想之选。我们将从最基础的语法讲起,逐步深入到更复杂的主题。文章将通过实例和练习,让你在实践中学习和理解Python编程。让我们一起开启这段代码之旅吧!
|
7天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
53 5
|
15天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
57 8
|
23天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
45 11
|
24天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
35 11
|
20天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
21天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
44 6
|
25天前
|
Python
如何提高Python代码的可读性?
如何提高Python代码的可读性?
38 4