python正则表达式
- 初识正则:
正则表达式对字符串的逻辑操作,主要是对字符串的一种过滤,用“元字符”与“普通字符”组成一个字符串规则对已知的字符串或文本过滤出自己想要的字符串。
使用正则是为了处理文本数据。如果是简单的文本处理,那使用字符串匹配就可以达到目的,但是这样每一次匹配都要单独写语句来完成,为了更加方便,需要抽象出一种规则,这就是正则表达式的由来。
1. 使用单个字符串来描述匹配一系列符合某个句法规则的字符串
2. 是对字符串操作的一种逻辑公式
3. 应用场景:处理文本和数据
4. 处理过程:一次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;否则匹配失败
python 的正则表达式默认区分大小写。
- 正则表达式的字符匹配:
正则表达式元字符:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJOAHWt8-1635050909045)(FF67C95E7E2A46A389D5937585AFA886)]
示例:
# coding:utf-8
import re
def 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-8
import re
def 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_again
if __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-8
import re
def check_url(url):
result = re.findall(r'http|https://\w*.*\w+.\w+', url)
return len(result) > 0
def 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:
# return
if __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 re
re.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 re
re.match(pattern, string, flags=0)
示例:
>>> mm = re.match('Python', str1)
>>> mm.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> mm = re.match('Linux', str1)
>>> mm.group()
'Linux'
re.search
的功能是在一个字符串中查找匹配。
用法:
import re
re.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 re
re.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 re
re.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 re
re.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']