这或许是我见过的最简单的正则表达式教程(一)

五一劳动节来啦,小小挖掘机们小编们首先祝大家劳动节快乐!

作为中国放假大学的一员,除了趁着长达8天的五一春假好好休整之外,当然还要忙中偷闲补习一下python的基本知识,今天想带代大家补习的是python中的正则表达式。不论你是否掌握python中的正则表达式,相信你看了此次教程之后会对它有一个更深入的理解和掌握。

话不多说,直接上代码:

github链接:https://github.com/princewen/professional-python3

第一节:基本知识

"""
作者:文文
python中的正则表达式
python版本:python3.5

"""

#python中正则表达式是re模块
import re

#re模块最主要的是search函数,接受一个正则表达式规则和一个字符串,返回第一个匹配,如果没有找到匹配,返回None
# r代表原始字符串,原始字符串与正常字符串的区别是原始字符串不会将\解释成一个转义字符,但是遇到+、(、)等的时候仍表示转义字符
# search对象返回结果可以又match对象接受,
match = re.search(r'fox','The quick brown fox jumped...')
#调用group得到搜索结果,输出fox
print (match.group())
#在原始字符串中匹配开始的索引
print (match.start())
#在原始字符串中匹配结束的索引
print (match.end())


#search 得到的是第一个匹配,如果想要的到所有的匹配,那么可以使用findall或者finditer函数
#findall 返回搜索结果的列表
#finditer 返回一个生成器
#output : ['o', 'o']
print (re.findall(r'o','The quick brown fox jumped'))
# output:<callable_iterator object at 0x102d386a0>
print (re.finditer(r'o','The quick brown fox jumped'))

第二节:基本匹配规则

"""
作者:文文
主要介绍一些基本的匹配规则
python版本:python3.5

"""

import re

"""1 字符组
使用方括号并在方括号内列出所有可能的字符从而表示一个字符组,一定要注意,它仅仅匹配一个字符
[Pp]:匹配大写P或者小写p
[A-Z]:匹配大写A到大写Z中任何一个
[^0-9]:在方括号中的^是取反字符(^还可以表示字符串的开始),表示匹配除0-9之外的字符

一些快捷方式
\w: 与任意单词字符匹配,python3中基本上与几乎任何语言的任意单词匹配,python2中至于英语单词字符匹配,但无论哪个版本,都会匹配数字、下划线或者连字符
\W: 匹配\w包含字符之外的所有字符
\d: 匹配数字字符,python3中,还与其他语言的数字字符匹配,在python2中,它只匹配[0-9]
\D: 匹配\d包含字符之外的所有字符
\s: 匹配空白字符,比如空格、tab、换行等
\S: 匹配\s包含字符之外的所有字符
\b: 匹配一个长度为0的字串,它仅仅在一个单词开始或结尾处匹配,也被称为词边界字符快捷方式
\B: 匹配不在单词开始或结束位置长度为0的子字符串,简单来说,使用\B表明这里不是一个单词的结束

字符串的开始与结束
^字符指定字符串的开始
$字符指定字符串的结束

任意字符
.字符表示任何单个字符,但是它仅仅只能出现在方括号字符组以外,如果出现在方括号里面,仅表示.字符这一个字符
"""

#output:<_sre.SRE_Match object; span=(0, 6), match='Python'>
print (re.search(r'[pP]ython','Python 3'))

#output:<_sre.SRE_Match object; span=(0, 6), match='python'>
print (re.search(r'[pP]ython','python 3'))

#output:<_sre.SRE_Match object; span=(0, 4), match='gray'>
print( re.search(r'gr[ae]y','gray'))

#output :None, 因为方括号仅仅匹配一个字符
print (re.search(r'gr[ae]y','graey'))

#output:<_sre.SRE_Match object; span=(0, 1), match='x'>
print (re.search(r'[a-zA-Z]','x'))

#output:<_sre.SRE_Match object; span=(0, 1), match='A'>
print (re.search(r'[^a-z]','A'))

#output:None
print (re.search(r'[^a-z]','b'))

#output : <_sre.SRE_Match object; span=(0, 4), match='cron'>
print (re.search(r'\bcron\b','cron'))

#output : None
print (re.search(r'\bcron\b','croner'))

#output : None
print (re.search(r'cron\B','cron'))

#output : <_sre.SRE_Match object; span=(0, 4), match='cron'>
print (re.search(r'cron\B','croner'))

#output : <_sre.SRE_Match object; span=(0, 1), match='P'>
print (re.search(r'\w','Python 3'))

#output : ['P', 'y', 't', 'h', 'o', 'n', '3']
print (re.findall(r'\w','Python 3'))

#output : None
print (re.search(r'^python','This code is in python'))

#output : <_sre.SRE_Match object; span=(0, 6), match='python'>
print (re.search(r'^python','python 3'))

#output : <_sre.SRE_Match object; span=(16, 22), match='python'>
print (re.search(r'python$','This code is in python'))

#output : None
print (re.search(r'python$','python 3'))

#output : <_sre.SRE_Match object; span=(0, 6), match='python'>
print (re.search(r'p.th.n','python 3'))

"""2 可选字符
目前为止,所有我们看到的正则表达式都是在正则表达式中的字符与被搜索的字符串中的字符保持1:1的关系,
然而有时,一个字符或许是可选的,比如有多种拼写方式的单词,如color 和 colour  都表示颜色
此时可以使用?指定一个字符、字符组或其他基本单元可选,即期望该字符、字符组或其他基本单元出现0次或者1次(这是?的第一个作用,出现在一个字符、字符组或其他基本单元后面时起作用)
"""

#output : <_sre.SRE_Match object; span=(15, 20), match='honor'>
print (re.search(r'honou?r','He served with honor and distinction.'))

#output : <_sre.SRE_Match object; span=(15, 21), match='honour'>
print (re.search(r'honou?r','He served with honour and distinction.'))

"""3 重复
有时你需要同样的字符或者字符组重复出现,或者出现0次或者1次
{N} : 表示一个字符、字符组或其他基本单元重复出现N次
{M,N} : 表示一个字符、字符组或其他基本单元重复出现M-N次,最少出现M次,最多出现N次,但尽可能匹配多的字符
{M,N}? : 表示一个字符、字符组或其他基本单元重复出现M-N次,但尽可能少的匹配字符(这是?的第二个作用,出现在重复之后,使其变为惰性匹配)
{M,}:  表示一个字符、字符组或其他基本单元重复出现至少M次,但没有上限
* : 代替{0,},表示一个字符、字符组或其他基本单元重复出现0次或多次
+ : 代替{1,},表示一个字符、字符组或其他基本单元重复出现1次或多次
"""

#output : <_sre.SRE_Match object; span=(0, 8), match='867-5309'>
print (re.search(r'[\d]{3}-[\d]{4}','867-5309 / Jenny'))

#output : <_sre.SRE_Match object; span=(0, 4), match='0323'>
print (re.search(r'[\d]{3,4}','0323'))

#惰性匹配, output : <_sre.SRE_Match object; span=(0, 3), match='032'>
print (re.search(r'[\d]{3,4}?','0323'))

#<_sre.SRE_Match object; span=(0, 4), match='1600'>
print (re.search(r'[\d]+','1600 Pennsylvania Ave.'))

未完待续。。。

想了解更多? 那就赶紧来关注我们

原文发布于微信公众号 - 小小挖掘机(wAIsjwj)

原文发表时间:2017-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

归并排序就这么简单

归并排序就这么简单 从前面已经讲解了冒泡排序、选择排序、插入排序,快速排序了,本章主要讲解的是归并排序,希望大家看完能够理解并手写出归并排序快速排序的代码,然后...

6477
来自专栏从零开始学 Web 前端

从零开始学 Web 之 JavaScript(二)变量

基础数据类型: String,Number,Boolean,unsigned、null

863
来自专栏积累沉淀

JavaScript对象和数组

学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型。而对象的值就是引用类型的实例。 一...

2565
来自专栏WindCoder

Java基础小结(二)

继承可以使用 extends 和 implements 这两个关键字来实现继承, 而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两...

1031
来自专栏Java帮帮-微信公众号-技术文章全总结

【Java提高三】三大特性-多态

【Java提高】三大特性-多态 面向对象编程有三大特性:封装、继承、多态。 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构...

3829
来自专栏吴伟祥

Java 可变参数 原

993
来自专栏LanceToBigData

JavaSE(一)之类与对象

终于到了要学习面向对象程序设计了,其中可能很多东西以前都知道怎么去用,但是却不知道怎么来的,或者怎么样写会出错,所以今天总结起来。 一、OOP概述   Java...

2175
来自专栏极客猴

Python中“is”和“==”的区别

相比 C/C++ 、Java 等强类型语言, Python 定义变量的方式就简单多了。我们只需要给变量起个变量名,而不需要给变量指定类型。

972
来自专栏xx_Cc的学习总结专栏

OC-基础总结(一)

38811
来自专栏猿人谷

标准库类型

一.标准string类型     string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。 1.1 strin...

1938

扫码关注云+社区

领取腾讯云代金券