正则表达式(regular expression) 是一种字符串匹配模式,通过特定的语法来检验一个字符串是否与某种模式匹配。正则表达式是一种功能十分强大的匹配模式,表达式形式特别丰富,但正因如此,所以觉得学起来比较困难。
个人觉得就是数学表达式如大于、不等于这种表达式的升级版。
目前python有re模块,保证了全部的正则表达式功能。很容易看出,re就是正则表达式英文名字的缩写。
首先,了解一下大致的语法情况。
语法:
1、正则表达式由普通字符(如字符a到z)和特殊字符(称为元字符)组成的表达式。提供一个模板与进行搜索的字符串进行匹配。
2、 对于可打印和不可打印字符,简单理解就是可打印字符,形如字符a到z,print后可以在显示屏显示。而不可打印字符也就是控制字符,如\n,代表换行,经过print后是没法打印出来的。
3、几种常见的不可打印字符:
\f 换页符
\n 换行符
\r 回车符
\s 任何空白字符 等价于[\f\n\r\t\v]
\t 制表符
\v 垂直制表符
4、限定符:
* 匹配前面的子表达式零次或者多次
+ 匹配前面的子表达式一次或者多次
? 匹配 前面的子表达式零次或者一次
{n} n是非负整数,匹配确定的n次
{n,} n是非负整数,匹配大于等于n次,例如a{2,} 可以匹配baaaaa,但是不能匹配ba
{n,m} 中间没有空格,至少n次,至多m次
5、定位符
^ 匹配以输入字符串开始的字符串,如^day,匹配以day开始的字符串。注意与放在中括号时的意义不同
$ 匹配以输入字符串结束的字符串,如jump$,匹配以jump结尾的字符串。
6、常见的一些元字符,包括显式指定为元字符
\ 代表转义
x|y x或者y
[xyz] 匹配包含的任意一个字符
[^xyz] 匹配未包含xyz的任意一个字符,^在中括号作用代表负值,相反的意思。
[a-z] 代表匹配一个字符范围
\d 匹配一个数字字符,相当于[0-9]
\D 匹配非数字字符,相当于[^0-9]
\w 匹配数字、字母、下划线,相当于[A-Za-z0-9_]
以上是基本的语法,主要是一些特殊字符的意义。具体的使用,自己目前主要是python的re模块中使用。
Re模块:
1、原生字符r,代表后面的字符串都是字面上的意思。这是为了避免反斜杠的过度使用,出现歧义。官方文档
个人理解:在正则表达式中,可以使用‘\n’,一个反斜杠就是代表反斜杠,加n进行转义;可以使用‘\\n’,两个反斜杠转义成一个反斜杠,加n进行转义;也可以使用r‘\n’代表一个反斜杠加n进行转义。
加上原始字符r之后,后面的字符代表原始的含义,但组合起来仍然可以进行转义。
>>> print(re.match('\d','123'))
<re.Match object; span=(0, 1), match='1'>
>>> print(re.match('\\d','123'))
<re.Match object; span=(0, 1), match='1'>
>>> print(re.match(r'\d','123'))
<re.Match object; span=(0, 1), match='1'>
可以看出以上三种表达方式的结果是一样的 ,所以为了避免歧义,一般都会在正则表达式前面直接加r。
注意,原生字符r在python中应该是通用的。print也可以用,但是加上r之后,就不存在转义现象,r'\n'就是'\n',不会像在正则表达式代表换行符。
2、re.match()函数,只从字符起始位置开始匹配,开始位置不匹配,就返回none。可以通过.start()获取起始位置,.end()获取结束位置,.span()获取范围。
re.match(pattern,string,flags=0)
flags是正则表达式修饰符,可选参数。
可以使用group() 来获取匹配到的字符串,对应的是在正则表达式中以小括号匹配的内容,有几个小括号,代表有几组。组号从1开始。groups()获取的是所有组的字符串【没有are】。注意加s不一样。
>>> line = "You are my pretty girl"
>>> a = re.search(r'(.*) are (.*) (.*) (.*)',line)
>>> a.group()
'You are my pretty girl'
>>> a.groups()
('You', 'my', 'pretty', 'girl')
>>> a.group(1)
'You'
3、re.search()函数,对整个字符串进行匹配,直到找到一个匹配。注意与re.match()的区别。
re.search(pattern, string, flags=0)
4、re.sub()函数,替换匹配项。
re.sub(pattern, repl, string, count=0, flags=0)
repl:替换的字符串,也可以是一个函数。
count:替换的最大次数,默认0表示替换所有匹配项。
# 将line中的are替换为were
>>> new_line = re.sub('are','were',line)
>>> new_line
'You were my pretty girl'
5、re.findall(pattern, string, flags=0) 搜索整个字符串,以列表的形式返回匹配的字符串。
a = "You are the beautiful girl"
>>> c = re.findall("e",a)
>>> c
['e', 'e', 'e']
以上是大体的python正则表达式内容,比较复杂的正则表达式还没有接触到,遇到的话会不断进行更新记录。