[阶段一] 16. Python正则表达式
python正则表达式
- 初识正则:
正则表达式对字符串的逻辑操作,主要是对字符串的一种过滤,用“元字符”与“普通字符”组成一个字符串规则对已知的字符串或文本过滤出自己想要的字符串。
使用正则是为了处理文本数据。如果是简单的文本处理,那使用字符串匹配就可以达到目的,但是这样每一次匹配都要单独写语句来完成,为了更加方便,需要抽象出一种规则,这就是正则表达式的由来。
1. 使用单个字符串来描述匹配一系列符合某个句法规则的字符串2. 是对字符串操作的一种逻辑公式3. 应用场景:处理文本和数据4. 处理过程:一次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;否则匹配失败
python 的正则表达式默认区分大小写。
- 正则表达式的字符匹配:
正则表达式元字符:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJOAHWt8-1635050909045)(FF67C95E7E2A46A389D5937585AFA886)]
示例:
# coding:utf-8import redef regular(data):get_num = re.findall(r'\d+', data) # r表示使用原字符串,不加则需要给特殊字符转义get_str = re.findall(r'\w+', data)for s in get_str:_get_str = re.findall(r'\d+', s)if _get_str:get_str.remove(s)return ' '.join(get_num), ' '.join(get_str)if __name__ == '__main__':info = 'my name is xiaobai, my age is 18.'result = regular(info)print(result)
结果:
('18', 'my name is xiaobai my age is')
- 正则表达式的量词与组:
| 符号 | 描述 |
|---|---|
| re1|re2 | 匹配正则表达式 re1 或 re2 |
| ^ | 匹配字符串起始部分 |
| $ | 匹配字符串终止部分 |
| * | 匹配 0 次或多次前面出现的正则表达式 |
| + | 匹配 1 次或多次前面出现的正则表达式 |
| {N} | 匹配 N 次前面出现的正则表达式 |
| {M,N} | 匹配 M~N 次前面出现的正则表达式 |
| […] | 匹配来自字符集的任意单一字符,如 [‘awk’] 表示匹配 ‘a’、‘w’ 或 ‘k’ |
| [^…] | 不匹配来自字符集的任意单一字符 |
| () | 匹配括号内指定的数据,括号内为一组 |
[a-zA-Z0-9_]完全等同于\w。
示例:
# coding:utf-8import redef regular(data):get_num = re.findall(r'\d{1,2}', data)get_str = re.findall(r'\w{3,5}', data)get_str_again = re.findall(r'\w{3, 5}', data)for s in get_str:_get_str = re.findall(r'\d+', s)if _get_str:get_str.remove(s)return ' '.join(get_num), ' '.join(get_str), get_str_againif __name__ == '__main__':info = 'my name is xiaobai, my age is 18.'result = regular(info)print(result)
结果:
('18', 'name xiaob age', [])
{M,N}作为次数范围匹配时,中间不可以有空格,不可以写成{M, N}。
在整个表达式匹配成功的前提下,贪婪模式是尽可能多的匹配,非贪婪模式是以最少的匹配字符,默认情况是贪婪模式。
匹配 0 次或多次属于贪婪模式,通过 ? 组合变成非贪婪模式。
示例:
# coding:utf-8import redef check_url(url):result = re.findall(r'http|https://\w*.*\w+.\w+', url)return len(result) > 0def get_url(url):result = re.search(r'(http|https)://(\w*.*\w+.\w+.*\w*)', url)return result.group(2)# if len(result) != 0:# return result# else:# returnif __name__ == '__main__':the_url = 'https://www.baidu.com'print(check_url(the_url))print(get_url(the_url))
结果:
True
www.baidu.com
- 正则表达式的
re模块:
在 python 中,如果想要使用正则表达式,需要先导入 re 模块:
import re
re 模块在 python 中有一些常用的方法,可以通过这些方法进行正则匹配。
常用的方法参数说明:
pattern:匹配的正则表达式string:要匹配的字符串flags:标记为,用于控制正则表达式的匹配方式。如:是否区分大小写(re.I),多行匹配(re.M)等等repl:替换的字符串,也可作为一个函数count:模式匹配后替换的最大次数,默认0表示替换所有匹配maxsplit:模式匹配后分割的最大次数,默认0表示不分割
re.compile 的功能是将正则表达式编译成正则对象,一次编译即可反复使用,不用每次写匹配规则。
用法:
import rere.compile(pattern, flags=0)
示例:
>>> str1 = 'Linux Python'>>> mm = re.compile(r'Python')>>> mm.search(str1)
<re.Match object; span=(6, 12), match='Python'>>>> mm.search(str1).group()
'Python'
re.match 的功能是从字符串的起始位置匹配,返回匹配对象。
用法:
import rere.match(pattern, string, flags=0)
示例:
>>> mm = re.match('Python', str1)>>> mm.group()
Traceback (most recent call last):File "" , line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> mm = re.match('Linux', str1)>>> mm.group()
'Linux'
re.search 的功能是在一个字符串中查找匹配。
用法:
import rere.search(pattern,string,flags=0)
示例:
>>> str1 = 'python booknum = 10000'>>> mm = re.search(r'\d+', str1)>>> mm
<re.Match object; span=(17, 22), match='10000'>>>> mm.group()
'10000'
>>> str1 = 'python booknum = 100000'>>> mm = re.search(r'\d+', str1)>>> mm.group()
'100000'
re.findall 的功能是找到匹配字符串,返回所有非重复匹配项的列表。
用法:
import rere.findall(pattern, string, flags=0)
示例:
>>> str1 = 'c++=1000, java=900, python=800'>>> mm = re.search(r'\d+', str1)>>> mm.group()
'1000'
>>> mm = re.findall(r'\d+', str1)>>> mm
['1000', '900', '800']>>> sum([int(x) for x in mm])
2700
re.sub 的功能是替换字符串中每一个匹配的子串后返回替换后的整个字符串。
用法:
import rere.sub(pattern, repl, string, count=0, flags=0)
示例:
>>> str1 = 'python booknum = 10000'>>> mm = re.sub(r'\d+', '10001', str1) #将10000替换为10001>>> mm
'python booknum = 10001'
>>> def add1(match): #创建一个自动 +1 的函数
... val = match.group()
... num = int(val) + 1
... return str(num)
... >>> str1
'python booknum = 10000'>>> mm = re.sub(r'\d+', add1, str1)>>> mm
'python booknum = 10001'>>> str1 = 'python booknum = 999'>>> mm = re.sub(r'\d+', add1, str1)>>> mm
'python booknum = 1000'
可以看到,通过函数,每次自动 +1 。
re.split 的功能是根据匹配分割字符串,返回分割字符串组成的列表。
用法:
import rere.split(pattern, string, maxsplit=0, flags=0)
示例:
>>> str1 = 'jingdongbook:C C++ Java Python'>>> mm = re.split(r':| ', str1) #以:和空格作为分割符>>> mm
['jingdongbook', 'C', 'C++', 'Java', 'Python']
>>> str1 = 'jingdongbook: C C++ Java Python,PHP'>>> mm = re.split(r':| |,', str1) #以:、空格和,作为分割符>>> mm
['jingdongbook', '', 'C', 'C++', 'Java', 'Python', 'PHP']
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
