Python学习手册之字符类和元字符深入

在上一篇文章中,我们介绍了 Python 的正则表达式和元字符,现在我们介绍 Python 的字符类和对元字符进行深入讲解。
查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/10027947.html

字符类
字符类提供了一种只匹配特定字符集中的一个字符的方法。字符类通过方括号把一列字符或一个范围括在一起。

import re

string1 = "python"
string2 = "eggs"
string3 = "hello"
pattern = r"[mnopq]"

search1 = re.search(pattern,string1)
search2 = re.search(pattern,string2)
search3 = re.search(pattern,string3)

if search1:
 print(search1.group())
 print("search 1")

if search2:
 print(search2.group())
 print("search 2")

if search3:
 print(search3.group())
 print("search 3")

运行结果:

>>>
p
search 1
o
search 3
>>>
匹配模式 [mnopq] 在 search 函数中匹配字符串包含的其中任何一个字符。

字符类可以匹配字符范围:
[a-z] 匹配任何小写字母。
[M-Q] 匹配任何大写字母从 M Q
[0-9] 匹配数字。
可以在一个类中包含多个范围。例如,[A-Za-z] 匹配任何情况下的一个字符。

import re

string1 = "python5"
string2 = "Aggs1"
string3 = "hello"
pattern = r"[a-z][a-z][0-9]"

search1 = re.search(pattern,string1)
search2 = re.search(pattern,string2)
search3 = re.search(pattern,string3)

if search1:
 print(search1.group())
 print("search 1")

if search2:
 print(search2.group())
 print("search 2")

if search3:
 print(search3.group())
 print("search 3")

运行结果:

>>>
on5
search 1
gs1
search 2
>>>
上面示例中的正则模式匹配包含两个小写字母然后跟着一个数字的字符串。

在字符类的开头有 ^ 表示匹配非字符类,也就是它与包含的字符之外的任何字符匹配。
有些元字符 (如 $ .) 在字符类中没有任何意义,元字符 ^ 同样没有任何意义,除非它是字符类中的第一个字符。

import re

string1 = "This is Python3.7"
string2 = "abc123"
string3 = "hello"
pattern = r"[^a-z]"

search1 = re.search(pattern,string1)
search2 = re.search(pattern,string2)
search3 = re.search(pattern,string3)

if search1:
 print(search1.group())
 print("search 1")

if search2:
 print(search2.group())
 print("search 2")

if search3:
 print(search3.group())
 print("search 3")

运行结果:

>>>
T
search 1
1
search 2
>>>
匹配模式 [^a-z] 用于排除小写字符串。注意,^ 应该位于括号内,表示非此字符类。

元字符深入
有些比较特殊的元字符是 *, +, ?, {},它们用来指定重复的次数。
元字符 * 叫通配符,是匹配范围最广的模式之一,因为它可以匹配零个或多个任意字符 (除了换行符:
\r\n),并且它总是尝试尽可能多的匹配,匹配可以是一个字符、一个类或括号中的一组字符。

import re

string1 = "python"
string2 = "abc123"
string3 = "pythonabc"
pattern = r"python(abc)*"

search1 = re.search(pattern,string1)
search2 = re.search(pattern,string2)
search3 = re.search(pattern,string3)

if search1:
 print(search1.group())
 print("search 1")

if search2:
 print(search2.group())
 print("search 2")

if search3:
 print(search3.group())
 print("search 3")

运行结果:

>>>
python
search 1
pythonabc
search 3
>>>
上面的示例匹配以 python 开头的字符串后面跟随零个或多个 abc 的字符串。
总是尝试匹配尽可能多的模式叫做贪心模式。

元字符 +* 非常相似,只不过它的意思是一个或多个重复,而不是零或多个重复。

import re

string1 = "pyt"
string2 = "abc123"
string3 = "pythonabc"
pattern = r"pyt+"

search1 = re.search(pattern,string1)
search2 = re.search(pattern,string2)
search3 = re.search(pattern,string3)

if search1:
 print(search1.group())
 print("search 1")

if search2:
 print(search2.group())
 print("search 2")

if search3:
 print(search3.group())
 print("search 3")

运行结果:

>>>
pyt
search 1
pyt
search 3
>>>
* 匹配前面表达式的 0 次或很多次。

+ 匹配前面表达式的 1 次或很多次。

元字符问号 ? 匹配零或一个前面的重复。

import re

string1 = "pyt-hon"
string2 = "abc123"
string3 = "pythonabc"
pattern = r"pyt(-)?hon"

search1 = re.search(pattern,string1)
search2 = re.search(pattern,string2)
search3 = re.search(pattern,string3)

if search1:
 print(search1.group())
 print("search 1")

if search2:
 print(search2.group())
 print("search 2")

if search3:
 print(search3.group())
 print("search 3")

运行结果:

>>>
pyt-hon
search 1
python
search 3
>>>

花括号
花括号可以用来表示两个数字之间的重复次数。表达式 {x,y} 表示匹配出现次数介于 xy 的前面的字符。因此 {0,1}? 意思相同。
如果不写第一个数字,它将默认为零。如果不写第二个数字,它被认为是可以匹配很多次。

import re

pattern = r"6{1,2}$"
string1 = "555"
string2 = "666"
string3 = "6"

search1 = re.search(pattern,string1)
search2 = re.search(pattern,string2)
search3 = re.search(pattern,string3)

if search1:
 print(search1.group())
 print("search 1")

if search2:
 print(search2.group())
 print("search 2")

if search3:
 print(search3.group())
 print("search 3")

运行结果:

>>>
66
search 2
6
search 3
>>>

6{1,2}$ 匹配字符串含有 1 次到 2 次的 6。
注意:在 Python 里指定的数字必须小于 4294967295 且第一个必须小于等于第二个。

“You can neither win nor lose if you don‘t run the race..”

“如果你都不敢站在跑道上,何谈输赢。” -- 大卫·鲍伊

原文地址:https://www.cnblogs.com/dustman/p/10036661.html

时间: 2024-10-15 00:33:13

Python学习手册之字符类和元字符深入的相关文章

Python学习手册笔记

之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书配套答案请到http://www.hzbook.com/Books/4572.html下载,简单注册即可. 第三章 如何运行程序 impor

python学习手册——1介绍python对象类型

在python ,数据以对象的形式出现--无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合. 由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型. python程序可以分解成模块,语句,表达式以及对象,如下所示: 1.程序由模块构成 2.模块包含语句 3.语句包含表达式 4.表达式建立并处理对象 为什么使用内置类型 1.内置

《Python学习手册》读书笔记【转载】

转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书

[读书]Python学习手册--属性管理1

属性管理-特性 一般开发这不必关心属性的实现,对工具的构建这来说,了解这一块对API的灵活性有帮助. 大多数情况下,属性位于对象自身之中,或者继承自对象所派生自的一个类. ----python学习手册 property property(fget=None, fset=None, fdel=None, doc=None) -> property attribute fget is a function to be used for getting an attribute value, and

《Python 学习手册》笔记 1

今天看了 Udacity 的 iOS 学习路线介绍,作者的看法是,最好先学习 Swift,而不是 Objective-C,原因一方面是 Swift 要简单一些,另一方面是因为 Apple 打算用 Swift 作为将来的官方语言取代 OC. 大学里,编程语言课程就是 C 和 C++.我不知道这是谁定的,也许他们有足够充分的理由.但是对于大多数人来说,这两个语言——一个太底层,一个太复杂)其实不见得那么重要.还不如学学 Ruby 和 Python 这样的抽象度更高的解释性语言,易于使用,而且内置了强

读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」

0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.PYTHON开发利器之VS Code之初识.简介.安装.中文 2.PYTHON开发利器之VS Code 主题.界面美化.快捷键.编辑器技巧 3.PYTHON开发利器之VS Code 常用插件介绍 4.PYTHON开发利器之使用VS Code进行python程序开发 5.1.PYTHON开发利器之使用VS Code+Git进行python

《Python学习手册 第五版》 -第16章 函数基础

前面的章节讲解的是一些基础数据类型.基本语句使用和一些文档查看的内容,这些都是一些基础,其实还谈不上入门,只有了解了函数,才算入门 函数是编程里面使用最多的也是最基本的程序结构, 本章重点内容 1.函数 1)什么是函数? 2)为什么使用函数? 2.编写函数 1)函数的基本格式 2)定义和调用函数 3)函数的多态.局部变量 接下来针对本章重点,展开详细的说明 1.函数 1)什么是函数? 这里没有严格的定义,用通俗易懂的方式来说: 函数就是将一些语句集合在一起的组件,从而让他们能够不止一次的在程序中

python学习手册

1.GUI开发 python中界面开发使用wxPython库,开发手册 wxPytyhon in action; *  http://wiki.woodpecker.org.cn/moin/WxPythonInAction *  http://blogimg.chinaunix.net/blog/upfile2/090208120235.pdf python学习手册

global语句(python学习手册422页)

# -*- coding: cp936 -*- #python 27 #xiaodeng #global语句(python学习手册422页) #实际上就是一个名为__builtin__的模块,但是必须要import之后才能使用,因为变量名builtin本身并没有预先内置 #global语句,命名空间的声明,告诉python计划生成一个或多个全局变量. #全局变量名小结: #1.全局变量是位于模块文件内部的顶层的变量名 #2.全局变量如果是在函数内被赋值的话,必须要经过global声明 #3.全局