正则表达式(Regular Expression,简称regex或regexp)是一种描述字符模式的强大工具,它可以帮助我们匹配、查找、替换文本中的特定模式。正则表达式由一系列的字符组成,其中一些字符具有特殊的含义,如 .、*、?、+、|、()、^、$ 等。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
还有一点要注意:正则表达式是通用的,可以在几乎所有的编程语言中使用,如JavaScript、PHP、Java、Python、C++等。不同编程语言对正则表达式语法的支持可能有所不同,有的编程语言支持所有的语法,有的仅支持一个子集。因此,虽然正则表达式在不同的编程语言中可能有细微的差别,但它们的核心概念和用法是通用的。
在Python中,我们使用正则表达式需要引用re模块,这个是内置模块,不需要下载,直接import re 导入就行
下面给大家介绍几种使用正则匹配的方法
正则表达式中的findall方法用于在字符串中查找所有匹配项,并返回一个包含所有匹配项的列表。
其基本语法如下:
import re
wz = "how are you 123"
print(re.findall('o', wz)) #['o', 'o']
返回的结果是列表包裹的,括号中的第一个'o’是我们要匹配的内容,而后面的wz就是从哪里去匹配,这个是很好理解的吧?
match是从字符串开头进行匹配(判断以什么开头),不是开头则返回None
import re
wz = "how are you 123"
t = re.match('h', wz)
print(t) # <re.Match object; span=(0, 1), match='h'>
返回的结果第一个是Match object(也就是math对象),第二个是下标位置,第三个就是我们获取的内容,也就是以什么开头的。math括号里面的第一个内容是要判断的字符,第二个是从哪里获取内容进行判断。
正则表达式的search方法用于在字符串中搜索匹配的子字符串,并返回第一个匹配的匹配对象。如果没有找到匹配的子字符串,则返回None。
import re
wz = "how are you 123"
s = re.search('o', wz)
print(s) #<re.Match object; span=(1, 2), match='o'>
返回的结果和math方法返回的结果差不多,仔细一看其实三个方法都差不多,但又有各自的特点,不过我们最常用的还是第一个findall方法。
下面介绍两种小方法
span方法用来获取数据的位置,也就是下标,不过这个和下面的那个获取内容的方法都比较鸡肋,不怎么用,了解就行
import re
wz = "how are you 123"
t = re.match('h', wz)
print(t) # <re.Match object; span=(0, 1), match='h'>
print(t.span()) # (0, 1)
这里获取的是内容的位置,但只能获取字符串的,这个方法和下面的那个方法都不能用findall方法,因为该方法返回的是列表,而不是字符串,math方法和search方法可以和此方法结合使用
group方法用来获取文本内容,可以单独打印出你获取的内容,但不适用于findall方法
import re
wz = "how are you 123"
s = re.search('o', wz)
print(s.span()) # (1, 2)
print(s.group()) # o
print(s) # <re.Match object; span=(1, 2), match='o'>
切记只能与math方法和search方法结合使用
字符串方法里面有replace替换的方法,那么正则表达式里面有没有呢?答案是肯定的
下面介绍基本用法:
import re
wz = "how are you 123"
x = re.sub('h', 'H', wz)
print(x) # How are you 123
第一个参数是想要替换掉的字符,第二个参数是要替换成什么样的字符,第三个参数是从哪里替换,后面还可以有一个参数,代表的是替换次数:
import re
wz = "how are you 123"
x = re.sub('o', 'O', wz, 1) # hOw are you 123
如果不写替换次数默认全部替换,写了就按照从前往后的顺序进行替换
这个是正则re模块的切割方法,不过大家看着是不是有点熟悉,没错,就是你们感觉的,这就是之前字符串切割的方法,其用法也差不多,只不过此方法需要引用re模块
其基本用法如下:
import re
wz = "how are you 123"
q = re.split("[ ]", wz)#re模块分割
print(q) # ['how', 'are', 'you', '123']
这次我是用空格切割这个字符串语句的,因此答案才是你们看到的模样,你们也可以试试用字符切割,这样理解的更加透彻
这个方法呢,也没有其他太多的用处,唯一的特点就是可以提前编译正则表达式,用一个变量来接收,然后再结合其他的方法去使用,这次可是两个知识点哦,要看仔细了
import re
wz = "how are you 123"
w = re.compile(r"\d")
print(re.findall(w, wz)) # ['1', '2', '3']
第三行呢就是咱们提前编译好一个正则,\d在正则表示匹配数字,是匹配所有的数字哦,明白我为啥要在后面写123了吧,可不要嫌弃我千篇一律的只用一个例子,想必大家都知道这么一句话:"好看的皮囊千篇一律,有趣的灵魂万里挑一",我举的例子就是这个意思,别看很低级,但没有一个是废话。言归正传,编译好正则我们用一个变量接受,然后结合findall全局匹配的方法进行使用,不过返回的结果是分开的字符串,就不是一个整体了。
现在我们了解了正则匹配的基本用法,下面就来看看特殊字符的使用吧
我们已经知道了正则表达式由一系列的字符组成,其中一些字符具有特殊的含义就叫做元字符,元字符都有什么?以下几种比较常用的我给大家列出来:
"""
元字符
.:通配符,匹配任意数字
^:匹配字符串的开始位置,在[]表示不匹配字符
$:匹配字符串的结束位置,以什么结尾
\:正则转义
{}:匹配次数
*:匹配零次或多次
+:匹配一次或多次
?:匹配0次或一次
[]:字符集合
():分组匹配
|:或运算 分支条件
\w:匹配单词字符
\W:匹配非单词字符
\s:匹配空白
\S:匹配非空白
"""
下面我给大家演示部分,感兴趣的可以自己敲代码去实现哦!
import re
z = "hao are you \n"
s = re.findall(".", z)
print(s) # ['h', 'a', 'o', ' ', 'a', 'r', 'e', ' ', 'y', 'o', 'u', ' ']
首先呢,先用通配符给大家匹配,什么是通配呢,那当然是统统匹配的了,有啥匹配啥,这就是我们的字面理解,但是呢,答案非要打我们的脸咋弄,匹配了一切,就是没匹配换行符,你瞅瞅,造孽啊,那我们使用转义字符行不行呢,说干就干:
import re
z = "hao are you \n"
s = re.findall(r".", z)
print(s) # ['h', 'a', 'o', ' ', 'a', 'r', 'e', ' ', 'y', 'o', 'u', ' ']
结果貌似还是没有换行符,不是说匹配一切的么,这咋连个小小的换行符都匹配不到,真.....,那么有没有办法呢,办法当然有,看你用不用心了,看仔细了:
import re
z = "hao are you \n"
s = re.findall(".|\n", z)
print(s) # ['h', 'a', 'o', ' ', 'a', 'r', 'e', ' ', 'y', 'o', 'u', ' ', '\n']
这不是就有了嘛,"|”名为管道符,在这里我们可以理解为“和”的意思,即匹配管道符左边的,又匹配管道符右边的,鱼和熊掌兼得,只要有能力有野心,小孩子才做选择,我统统都要。
在这里给大家补充一个概念
什么是单词边界呢?数字前后两端不是正规字符就是单词边界,那么什么又是正规字符,什么又是不正规的字符呢?正规字符有数字,英文,中文,下划线,不正规的字符就像我们键盘QW上面的某某某几个还有"\t"、"\n"什么的,感兴趣的可以去网上搜一搜,在这里我就不一一罗列了。
在正则表达式中,单词边界是一个特殊的元字符,用\b表示。它用于匹配一个单词的开头或结尾,或者一个单词与非单词字符之间的位置。单词边界不是指任何特定的字符,而是指单词和非单词字符之间的位置。
我觉得正常的操作不容易是我们理解这两个正则字符,所以我写了下面的代码
r = input("请输入一位手机号")
import re
x = re.findall("^1\d{9}8$", r)
print(x)
这个代码要自己去实验才更容易理解,容我卖个关子,我只说它是干嘛的,其余的你们自己去实验,这几段代码是用来测试手机号是以什么开头和以什么结尾的,但凡不是按照上面的内容写入的都会返回[]。
元字符就介绍到这里,其他的你们可以自己去敲一敲代码,去试一试,俗话说:读万卷书,也要行万里路,才能上知天文下知地理。嘿嘿,我瞎说的,但确实有一定的道理,你们说呢
想深入了解正则的可以去菜鸟教程看一看,链接我放到下面:
今天的分享已经结束,不懂的可以评论或者私信我,喜欢的话就双击一下吧,鄙人感激不尽。