目录
一、判断字符串中是否含有字串
二、正则表达式
(一)基本内容
1.正则表达式修饰符——可选标志
2.正则表达式模式
(二)常见表达式函数
in
,not in
判断字符串中是否含有某些关键词,方法比较多 例如分词后对词向量和关键词进行==
匹配,但这种方法以来分词的准确性,不太推荐; 其次使用成员运算符in
,not in
可以较好的判断字符串中是否包含某关键词,即特定字串
a = '这个暑假我读了红楼梦和三国演义'
b= ['三国演义','水浒传','西游记','红楼梦']
n = 0
for i in b:
if i in a:
n += 1
print(f'四大名著暑假读了{n}本')
这种遍历算法虽然可以成功得到想要的结果,但是当数据量很大的时候,程序执行效率将会很低。正则匹配作为专业的查找工具,在判断字符串中含有特定字串的事情上可以大大提高工作效率。
2.正则匹配re.findall
import re
def is_in(fullstr,substr):
if re.findall(substr,fullstr):
return 1
else:
return 0
a = '这个暑假我读了红楼梦和三国演义'
b= ['三国演义','水浒传','西游记','红楼梦']
n = 0
for i in b:
n = is_in(a,i)
n += 1
print(f'四大名著暑假读了{n}本')
findall
:返回string中所有与pattern匹配的全部字符串,返回形式为数组
re.findall(pattern, string, flags``=``0``)
示例如下:
line = []
n = 0
for i in b:
num = is_in(a,i)
n += num
res = re.findall(i,a)
line = line + res
print(f'四大名著暑假读了{n}本')
print(f'分别是{line}')
'''
res = re.findall(i,a) re.findall返回值是一个列表
out:
四大名著暑假读了2本
分别是['三国演义', '红楼梦']
'''
正则的功能十分强大,上述使用的只是其中一个很小的功能。下面继续对正则的强大功能进行学习
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志
修饰符 | 功能 | 全称 |
---|---|---|
re.I | 匹配忽略大小写 | re.IGNORECASE |
re.L | 做本地化识别(locale-aware)匹配,即表示特殊字符集 \w , \W , \b , \B , \s , \S 依赖于当前环境(该标记官方已经不推荐使用) |
re.LOCALE |
re.M | 多行匹配,影响^ 和$ (正则表达式中^ 表示匹配行的开头,默认模式下它只能匹配字符串的开头;而在多行模式下,它还可以匹配 换行符\n 后面的字符。NOTE:正则语法中^ 匹配行开头、\A 匹配字符串开头,单行模式下它两效果一致,多行模式下\ A不能识别\n ) |
re.MULTILINE |
re.S | 使·. 匹配包括换行在内的所有字符(DOT表示.,ALL表示所有,连起来就是. 匹配所有,包括换行符\n 。默认模式下. 是不能匹配行符\n 的) |
re.DOTALL |
re.U | 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库(与 ASCII 模式类似,匹配unicode编码支持的字符,但是 Python 3 默认字符串已经是Unicode,所以有点冗余) | re.UNICODE |
re.X | 增加可读性,忽略空格和 # 后面的注释 (默认模式下并不能识别正则表达式中的注释,而详细模式是可以识别的) | re.VERBOSE |
re.A | 让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode | re.ASCII |
re.DEBUG | 显示编译时的debug信息 | re.DEBUG |
模式字符串使用特殊的语法来表示一个正则表达式: (1)字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。 (2)多数字母和数字前加一个反斜杠时会拥有不同的含义,例如\n
表示换行。 (3)标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。 (4)反斜杠本身需要使用反斜杠转义。 (5)由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示它们。模式元素(如 r'\t'
,等价于 '\\t'
)匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式 | 功能 | 示例 | 匹配的字符串 |
---|---|---|---|
^ |
匹配字符串的开头 | ||
$ |
匹配字符串的结尾 | ||
. |
匹配任意字符,除了换行符\n |
||
[…] |
表示一组字符单独列出 | [like] |
'l' ,'i' ,'k' 'e' |
[^…] |
表示不在[]中的字符 | [^like] |
除了'l' ,'i' ,'k' ,e 之外的字符 |
\w |
匹配字母数字及下划线 | a-z 、A-Z 、0-9 、_ |
|
\W |
匹配非字母数字及下划线 | ||
\s |
匹配任意空白字符,等价于\t \n \r \f |
||
\S |
匹配任意非空字符 | ||
\d |
匹配任意数字,等价于 [0-9] | ||
\D |
匹配任意非数字 | ||
\A |
匹配字符串开始 | ||
\z |
匹配字符串结束 | ||
\Z |
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 | ||
\G |
匹配最后匹配完成的位置 | ||
\b |
匹配一个单词边界,也就是指单词和空格间的位置 | er\b |
never (√),verb (×) |
\B |
匹配非单词边界 | er\b |
never (×),verb (√) |
\n \t 等 |
匹配一个换行符。匹配一个制表符。等 | ||
\1 …\9 |
匹配第n个分组的内容 | ||
\10 |
匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式 | ||
re* |
(* 贪婪)匹配0个或多个表达式(前一个字符出现0次或者⽆限次,即可有可⽆) |
abc* |
abccc |
re+ |
(+ 懒惰)匹配1个或多个的表达式(前一个字符出现1次或者⽆限次,即⾄少有1次) |
abc+ |
abc abcccc |
re? |
(? 占有)匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式(前一个字符出现1次或者0次,即要么有1次,要么没有) |
abc? |
abc ab |
re{n} |
前一个字符出现n次 | o{2} |
food |
{m,n} |
匹配前⼀个字符出现从m到n次,若省略m,则匹配0到n次,若省略n,则匹配m到无限次 | ab{1,2}c |
abc abbc |
a |b |
匹配a或b | ||
(re) |
对正则表达式分组并记住匹配的文本 | ||
\num |
引⽤分组num匹配到的字符串 | ||
(?P |
分组起别名,匹配到的子串组在外部是通过定义的 name 来获取的 | ||
(?P=name) |
引⽤别名为name分组匹配到的字符串 |
正则表达式是一个特殊的字符序列,可以方便的检查一个字符串是否与某种模式匹配,python自带的re
模块使 Python 语言拥有全部的正则表达式功能 python常用的正则表达式函数如下:
功能分类 | 函数 | 功能 |
---|---|---|
查找一个匹配项 | re.search | 查找任意位置的匹配项 |
re.match | 必须从字符串开头匹配 | |
re.fullmatch | 整个字符串与正则完全匹配 | |
查找多个匹配项 | re.findall | 从字符串任意位置查找,返回一个列表 |
re.finditer | 从字符串任意位置查找,返回一个迭代器 | |
分割 | re.split | 用正则表达式将某字符串分割成多段 |
替换 | re.sub | 替换掉某字符串中被正则表达式匹配的字符,返回替换后的字符串,替换可以是字符串 也可以是 函数 |
re.subn | 替换掉某字符串中被正则表达式匹配的字符,返回替换后的字符串 和 替换次数 | |
编译正则对象 | re.compile | 将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern) |
re.template | 将正则表达式的样式编译为一个 正则表达式对象 ,并添加re.TEMPLATE模式 | |
其他 | re.escape | 可以转义正则表达式中具有特殊含义的字符,比如: . 或者 * |
re.purge | 清除正则表达式缓存 |
re.match
re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none
re.match(pattern, string, flags``=``0``)
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。详见表1修饰符 |
匹配成功 re.match
方法返回一个匹配的对象,否则返回 None 可以使用 group(num)
或 groups()
匹配对象函数来获取匹配表达式
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 |
0:表示正则表达式中符合条件的字符串。 1:表示正则表达式中符合条件的字符串中的第一个() 中的字符串。 2:表示正则表达式中符合条件的字符串中的第二个() 中的字符串。 以此类推…
import re
fullstr = 'name:alice,result:89'
result = re.match('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.group())import` `re``fullstr ``=` `'name:alice,result:89'``result ``=` `re.match(``'name:(\w+),result:(\d+)'``, fullstr)``print``(result)``print``(result.group(``0``))``print``(result.group(``1``))``print``(result.group(``2``))``print``(result.group())
结果:
out1:
out2: name:alice,result:89 out3: alice out4: 89 out5: name:alice,result:89
从结果可以看出,re.match()方法返回一个匹配的对象,而不是匹配的内容。通过调用span()可以获得匹配结果的位置。而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None 可以使用group()
来提取每组匹配到的字符串。 group()会返回一个包含所有小组字符串的元组,从 0 到 所含的小组号
注意:如果在运用正则表达式做匹配的过程中没有匹配到元素,之后又调用了group(),会报错:AttributeError: 'NoneType' object has no attribute 'group'
如果出现这种报错,可以将match改成search()就可以避开这类问题了。search函数是先扫描全部的代码块,再进行提取的
2.re.search
re.search会匹配整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None
re.search(pattern, string, flags``=``0``)
参数同re.match
示例:
import re
fullstr = 'class:1班,name:alice,result:89'
result = re.match('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))
out1: None out2: AttributeError: ‘NoneType’ object has no attribute ‘group’ 原因:match在起始位置匹配,如果不是起始位置匹配成功的话,match() 就返回 none
尝试search
import re
fullstr = 'class:1班,name:alice,result:89'
result = re.search('name:(\w+),result:(\d+)', fullstr)
print(result)
print(result.group(0))
print(result.group(1))
print(result.group(2))
print(result.group())
out1:
out2: name:alice,result:89 out3: alice out4: 89 out5: name:alice,result:89
re.sub
该函数主要用于替换字符串中的匹配项
re.sub(pattern, repl, string, count``=``0``, flags``=``0``)
示例如下:
参数 | 说明 |
---|---|
pattern | 必须参数:正则中的模式字符串 |
repl | 必须参数:替换的字符串,也可为一个函数 |
string | 必须参数,要被查找替换的原始字符串 |
count | 可选参数,模式匹配后替换的最大次数,默认 0 表示替换所有的匹配 |
flags | 可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0 |
#修改分数
fullstr = 'name:alice,result:89'
res1 = re.sub(r'\d+','90',fullstr)
print(res1)
out: name:alice,result:90
repl
可以为一个函数。如下:
#修改分数
def change(matched):
value = int(matched.group('value'))
return str(value + 1)
fullstr = 'name:alice,result:89'
res1 = re.sub('(?P\d+)',change,fullstr)
print(res1)
out: name:alice,result:90
4.re.compile
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用 re 模块的一般使用步骤是:
1.使用 compile 函数将正则表达式的字符串形式编译为一个 Pattern 对象 2.通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果(一个 Match 对象) 3.最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作里是引用
re.``compile``(pattern, flags)
compile
返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(), match()搭配使用
5.re.findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表 注: match 和 search 是匹配一次 findall 匹配所有
6.re.split
re.split(pattern, string[, maxsplit``=``0``, flags``=``0``])
到此这篇关于python使用正则匹配判断字符串中含有某些特定子串 及 正则表达式详解的文章就介绍到这了,希望对大家有帮助。