一、正则是什么?
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
几个函数与方法的区别
查找
- re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
- re.search 扫描整个字符串并返回第一个成功的匹配。
- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
- compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用
- findall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。( match 和 search 是匹配一次 findall 匹配所有)
- 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
替换
- 检索和替换
- re.sub(pattern, repl, string, count=0, flags=0)
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
插一张图
图片链接https://blog.csdn.net/weixin_44312186/article/details/99467391
侵删
规则 | 说明 |
---|---|
sub(pattern,repl,string) | 把字符串中的所有匹配表达式pattern中的地方替换成repl |
[^**] | 表示不匹配此字符集中的任何一个字符 |
\u4e00-\u9fa5 | 汉字的unicode范围 |
\u0030-\u0039 | 数字的unicode范围 |
\u0041-\u005a | 大写字母unicode范围 |
\u0061-\u007a | 小写字母unicode范围 |
\uAC00-\uD7AF | 韩文的unicode范围 |
\u3040-\u31FF | 日文的unicode范围 |
二、使用步骤
1.引入库
代码如下(示例):
import re
2.函数的不同
1 re.match()
从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
content = 'Hello 123' \
'4567 is ' \
'a number. Regex String'
result = re.match(r'.*?(\d+).*',content,flags=re.S)
# print(result.group(1))
print(result.group(1))
re.s
2 re.search()
扫描整个字符串并返回第一个成功的匹配。
content = 'Hello 1234567 World'
result = re.match('.*?(\d{7}).*?',content)
print(result.group(1))
网页提取数据
hemo = '''
<li data-view="12">
<a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
</li>
'''
result = re.search('<a.*="(\S*)">(\S+)</a>',heml)
print(result.group(1),result.group(2))
匹配邮箱
data = '2623485575@qq.com 7685737@qq.com wifhwfew@er.con'
pattern = r'([a-zA-Z0-9_-]{1,19}@[a-zA-Z0-9_-]{1,13}\.[a-zA-Z0-9]{2,3})'
data = re.findall(pattern, string, flags=0)
print(data)
解释一下:[a-zA-Z0-9_-]包括了所有英文字母,0-9,还有 减 - 下划线 _ ;
{1,19}: 范围 ,最多19个字符,最少一个
反斜杠 转译 让后面的点成为普通字符
匹配连续重复单词
str = "Is is the cost of of gasoline going up up"
patt1 = r"\b([a-zA-Z]+)\s+\1"
data = re.findall(patt1,str)
print(data)
\b : 位置匹配,匹配单词边界
\s : 空格、制表符、换页符等空白字符的其中任意一个
\1 : 代表前面括号内模式,重复匹配
匹配字符并加上判断
总结
开始用正则就是很懵逼,入门就好