正则表达式定义:
正则表达式是字符串处理的有力工具,正则表达式使用预定义的模式去匹配一类具有共同特征的字符串,可以快速、准确地完成复杂的查找、替换等处理要求,比字符串自身提供的方法提供了更强大的处理功能。
例如使用字符串对象的split()方法只能指定一个分隔符,而使用正则表达式可以很方便地指定多个符号作为分隔符;使用字符串对象的split()并指定分隔符时,很难处理分隔符连续多次出现的情况,而正则表达式让这一切都变成非常轻松。
正则表达式在文本编辑与处理、网页爬虫之类的场合中有重要应用。
- split()函数
语法:str.split(str="",num=string.count(str))[n]
参数说明:
str: 表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素
num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量
[n]: 表示选取第n个分片
注意:当使用空格作为分隔符时,对于中间为空的项会自动忽略
u = "www.baidu.com.cn"
#使用默认分隔符
print (u.split())
#以"."为分隔符
print (u.split('.'))
#分割0次
print (u.split('.',0))
#分割一次
print (u.split('.',1))
#分割两次
print (u.split('.',2))
#分割两次,并取序列为1的项
print (u.split('.',2)[1])
#分割最多次(实际与不加num参数相同)
print (u.split('.',-1))
#分割两次,并把分割后的三个部分保存到三个文件
u1,u2,u3 = u.split('.',2)
print (u1)
print (u2)
print (u3)
结果如下:
['www.baidu.com.cn']
['www', 'baidu', 'com', 'cn']
['www.baidu.com.cn']
['www', 'baidu.com.cn']
['www', 'baidu', 'com.cn']
baidu
['www', 'baidu', 'com', 'cn']
www
baidu
com.cn
正则表达式语法:
正则表达式由元字符及其不同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成查找、替换、分隔等复杂的字符串处理任务。
正则表达式基本语法:
基本语法1.png基本语法2.png
- 如果以“\”开头的元字符与转义字符相同,则需要使用“\”,或者使用原始字符串。
- 在字符串前加上字符r或R之后表示原始字符串,字符串中任意字符都不再进行转义。原始字符串可以减少用户的输入,主要用于正则表达式和文件路径字符串的情况,但如果字符串以一个斜线“\”结束的话,则需要多写一个斜线,即以“\”结束。
str1=r"sadasfasdfasf"
print(str1)
结果如下:
sadasfasdfasf
str1="sdasd\n\tfasefwas"
print(str1)
结果如下:
sdasd
fasefwas
str1=r"dsad\n\tvdsf"
print(str1)
dsad\n\tvdsf
正则表达式扩展语法:
- 正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体对待,例如'(red)+'可以匹配'redred'、'redredred'等一个或多个重复'red'的情况。
-
使用子模式扩展语法可以实现更加复杂的字符串处理功能。
扩展语法.png - 最简单的正则表达式是普通字符串,可以匹配自身
'[pjc]ython'配'python'、'jython'、'cython'
'[a-zA-Z0-9]'可以匹配一个任意大小写字母或数字
'[^abc]'可以一个匹配任意除'a'、'b'、'c'之外的字符
'python|perl'或'p(ython|erl)'都可以匹配'python'或'perl' - 子模式后面加上问号表示可选。
r'(http://)?(www.)?python.org'只能匹配'http://www.python.org'、'http://python.org'、'www.python.org'和'python.org' - '^http'只能匹配所有以'http'开头的字符串
- (pattern)*:允许模式重复0次或多次
- (pattern)+:允许模式重复1次或多次
- (pattern){m,n}:允许模式重复m~n次
(http://)?(www\.)?python\.org
1\ \.表示字符串,而.表示任意字节
2\()表示括号内的内容看作是一个整体
3\ ?表示前面的内容出现0次或1次
所以:
python.org
正则表达式模块re处理字符串:
-
Python标准库re模块提供了正则表达式操作所需要的功能
标准库.png
re.match函数:
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
-
函数语法:
re.match(pattern, string, flags=0)
函数1.png - 匹配成功re.match方法返回一个匹配的对象,否则返回None。
-
可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
函数2.png
re.search方法:
re.search 扫描整个字符串并返回第一个成功的匹配。
-
函数语法:
re.search(pattern, string, flags=0)
函数3.png - 匹配成功re.search方法返回一个匹配的对象,否则返回None。
-
可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
函数4.png
re.match与re.search的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.sub:
Python 的re模块提供了re.sub用于替换字符串中的匹配项。
-
语法:
re.sub(pattern, repl, string, count=0)
函数5.png
compile函数:
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
- 语法格式为:
re.compile(pattern[, flags])
import re;
str1="aaaa hhhhh bbbb nnnnnnnn bbb"
#arr=re.match("a(.*?)f",str1)
arr=re.search("aaaa .*? bbbb (.*)",str1)
print(arr)
print("gggg::::",arr.group(1))
#print(arr.group(2))
#总结:1.re.search可以使用正则表达式,对字符串进行匹配,
# ()括号里的内容会送入到group中,使用group(1)获得匹配内容
结果如下:
<_sre.SRE_Match object; span=(0, 29), match='aaaa hhhhh bbbb nnnnnnnn bbb'>
gggg:::: nnnnnnnn bbb
# 正则表达式的书写规则
# . 表示单个任意字符 如:a、b、c、1、23
# .* 表示0或者多个字符 '' 'ab' 'abcdsaafdafs'
# .+ 表示1或者多个字符 'ab' 'adawdsfsadfsadf'
# - 表示范围【0-9】 【a-z】 【A-Z】
# |之前或之后的字符 'a|b|c' a b c
# ^后面的字符开头的字符串 ^186.* 1864685646464688
# $前面的字符结尾的字符串 888$ 34258888 trueey888 888sdaasf
# ?之前的0个或1个字符 1[0-9]?6 176 16 1776
# ? 第二个意义:非贪婪(最小匹配) a(.*?)f af asddf
# re.match 尝试从字符串起始位置进行匹配,如果开始位置匹配不到,则返回None
# re.search 对整个字符串进行搜索,返回第一个匹配成功
# group "aaaa (.*?) bbbb (.*?)"
import re
str1="dddd aaaa hhhhh bbbb nnnnnnnnnnn bbbb ttttttt"
#arr=re.match("a(.*?)f",str1)
arr=re.sub("aaaa .*? bbbb (.*?)","aaaaaaaaaaaaaaaaaa",str1)
print(arr)
结果如下:
dddd aaaaaaaaaaaaaaaaaannnnnnnnnnn bbbb ttttttt
此篇文章仅用于个人学习笔记使用,如有错误欢迎指正。
网友评论