python 正则表达式

 
无需记忆
 
搜索 / 替换 / 解析
06/09 课题:
字符串 分隔  split
shell 命令分隔
re.split
re正则表达式分隔 难度系数大
 
r 代表将字符串转为正则 例: python字符串 '\\$\\d+' =  r"\$\d"
 如 print(r'boy \n friend')
 #boy \n friend
.  点代表任意字符 但不能匹配/n
. 字符 匹配内容和内容一个 , 成对 , 如果不能成对则无匹配 ;
字符 .  匹配内容和内容一个 ; 
. . .字符 点代表字符个数
字符 . + 代表字符后面全部
* 星号代表 全部字符串 后面没有内容时 包括
print(re.findall('wo*','wss~w!'))
#代表一个w后面0次或多次的o
#['w', 'w']
print(re.findall('w*','woo~ws!'))
#['woo', 'w']
+ 加号也是代表全部字符串 但后面没有内容时 不包括
[  ] 匹配括号里面的字符 大小写 例子:[0-9] [a-z] [A-Z]
\  特殊字符转义 可以用来匹配特殊字符 例 \- 匹配所有 “-”
print(re.findall('\-','boy-friend'))
#['-']
\s 匹配换行 空格 \S匹配非空白
[\-\s] 匹配 匹配所有 “-” 和 空格
\d 匹配所有数字 等于 [0-9] \D 匹配非数字
\d{3} 花括号代表重复的数字 例:ab{2}为abb
\w 数字 大小写字母
\b 匹配完整单词 例: \b thank \b匹配thank单词而不是thanks ;\B非单词边界print(re.findall(r'\bis\b','this is a boy'))
#['is']
print(re.findall(r'\Ber\B','there'))
#['er']
字符:匹配开头 以这个字符为开头 \A 也表示开头
[字符] 不匹配
字符 $:文本的末尾 即最后一个字符 \Z 也表示结尾
字符 ? 代表字符可以出现或不可以出现 例:有些单词的写法不同 install 和instll  同时匹配的话 是insta?ll
   #贪婪和非贪恋差异
  
print(re.findall('\[.+]',"[abbbb],[abb]"))  #['[abbbb],[abb]']
   print(re.findall('\[.+?]',"[abbbb],[abb]")  #['[abbbb]', '[abb]']
    再例:print(re.findall('aa?',"wwadss aa")) #['a', 'aa'] 重点看 看?前匹配的字符
{数字1,数字2}  例: ad{1,3} 为 ab/abb/abbb
{5,9}?  代表遇到5个数量的数字就不匹配了
   【加上问号,非贪婪模式:匹配重复的元字符 总是尽可能的向后匹配内容】
         【贪婪模式定义】:匹配重复的元字符 总是尽可能的向后匹配内容 比如: * + ? { m,n }
print(re.findall('ab?',"abbbbb a"))   #['ab', 'a'] 加上问号 代表不贪婪
print(re.findall('ab*?',"abbbb"))     #['a'] *最少的状态是a
print(re.findall('ab+?',"abbbbb"))    #['ab'] *最少的状态是ab
{3,} 代表显示3个以上的数量 
\d + 代表显示 1个以上的数量  =  \d *  代表显示 0 个以上的数量
 
进阶 分组/断言  
( )分组 提取数据时需要 分组的作用:捕获数据 例: (\d{4}) 提取4位数字
| 或者
\1 代表(第一组)相同的内容 \2 代表(第二组)相同的内容
(?:表达式) 非捕获分组
 
字符里无小于号
喜欢(?=你) ----> 喜欢
喜欢(?!你)  ----> 喜欢
字符里小于号
(?<=我)喜欢 ---> 喜欢
(?<!我)喜欢  ---> 喜欢
技巧 “我喜欢你"--> (?<!我)喜欢(?=你) = 打印为 “喜欢你” 巧记:‘无我(?<!我)’喜欢‘你(?=你)’
 
匹配字符 :
. [...] [^...] \d \D \w \W \s \S 
匹配重复:
* + ?{n} {m,n}
匹配位置:
^ $ \A \Z \b \B
其它:
| ()  \
模块
re.compile 不能直观地看到结果 生成正则表达式对象,方便后续调用
import re
r = '''hello, i am Tony'''
s = re.compile("\w*o")
print(s)
#re.compile('\\w*o')
t = s.findall(r)
print(t)
#['hello', 'To']
findall调用与compile区别 是compile 可以截取目标字符串
#目标字符串
s = "Alex:1994,Sunny:2000"
pattern = r'(\w+):(\d+)'
#re模块调用 findall
print(re.findall(pattern,s)) #[('Alex', '1994'), ('Sunny', '2000')]
#re模块调用 compile
l = re.compile(pattern)
print(l.findall(s)) #[('Alex', '1994'), ('Sunny', '2000')]
#findall调用与compile区别 compile 可以截取目标字符串 表示位置上的
print(l.findall(s,0,6)) #[('Alex', '1')] 6代表第五个位置
for i in range(0,2):
print(i)
#0
#1
re.search() .group()
 print(re.search(r'|\w{1,5}','李星星同志,王同学').group()) #李星星同志
 
print(re.search(r'ab+','ababab').group()) #ab
print(re.findall('ab+',"ababab"))#['ab', 'ab', 'ab']

print(re.search(r'(ab)+','ababab').group()) #ababab
print(re.search(r'ab+','ababab').group()) #ab
.group(1) :可以通过编程语言某些接口获取匹配内容,子组对应的内容
(?p<name>pattern)捕获组:子组起名,有名称的子组即为捕获组
print(re.search(r'(https|http|ftp|file)://\S+',"http://www.baidu.com").group(1)) #http
print(re.search(r'(?P<pig>ab)+','ababab').group()) #ababab
print(re.search(r'(?P<pig>ab)+','ababab').group('pig')) #ab
re.split():
s = "Alex:1994,Sunny:2000"
print(re.split(r'[:,]',s)) #['Alex', '1994', 'Sunny', '2000']
re.finditer():
#返回迭代对象
s = '今年是2019,建国70周年'
pattern = r'\d+'
it = re.finditer(pattern,s)
#获取match对象对应内容
for i in it:
print(i.group())
#2019
#70
re.fullmatch()  完全匹配某个目标字符串 把目标字符串全部匹配出来 完整的
#完全匹配一个字符串 必须是完整的字符串 相当于 已定义开头和结尾 如^\w$
s = '今年是2019,建国70周年'
# ll = re.fullmatch('\w',s)
# print(ll.group()) 匹配失败 有逗号在'''
ll = re.fullmatch(r'[\W\w]+',s)
print(ll.group()) #今年是2019,建国70周年
re.match 匹配某个目标字符串开始位置
#匹配第一个 第一个字符是什么类型就写什么类型 后面有加号对应第一个后的相应字符
print(re.match(r'[\w]+','dd,2s, ddd ').group())#dd
# print(re.findall('[\w]+',"dd,2s, ddd ")) #['dd', '2s', 'ddd']
re.search 匹配目标字符串第一个符合内容
print(re.search(r'\d+','2019年是建国70周年').group())#2019
正则表达式属性 (不常用)
regex = re.compile(r'(ab)cd(?P<pig>ef)')
print(regex.flags) #32
'''match 对象属性演示'''
pattern = r'(ab)cd(?P<pig>ef)'
regex = re.compile(pattern)
obj = regex.search('abcdefge',0,7)
 
'''重点''‘ #(属性方法)
print(obj.group()) #abcdef
print(obj.group(1)) #ab
print(obj.group('pig')) #ef #pig组为第二组
#获取match对象匹配内容
#默认为0表示获取整个match对象内容,如果是序列号或者组名则表示对应子组内容
#返回字符串
 
#属性变量
print(obj.pos) #0 目标字符串开始位置
print(obj.endpos) #7 目标字符串结束位置
print(obj.re) #正则
print(obj.string) #目标字符串 不是截取的
print(obj.lastgroup)#pig 最后一组组名
print(obj.lastindex)#2 最后一组序列号
#属性方法
print(obj.span()) #匹配内容在字符串中位置 #(0, 6)
print(obj.start()) #开始位置 #0
print(obj.end()) #结束位置 #6
print(obj.groupdict())#捕获组字典 {'pig': 'ef'}
print(obj.groups()) #子组对应内容元祖 ('ab', 'ef')
flags参数扩展
s = '''Hello
北京
'''
A == ASCII 元字符只能匹配ASCII
print(re.compile(r'\w+',flags=re.A).findall(s)) #['Hello']
I   == IGNORECASE 匹配忽略字母大小写
print(re.compile(r'[a-z]+',flags=re.I).findall(s)) #['Hello']
== DOTALL 使. 可以匹配换行
print(re.compile(r'.+',flags=re.S).findall(s))#['Hello\n北京\n']
M == MULTILINE 使^$可以匹配每一行的开头结尾位置
print(re.compile(r'^北京',flags=re.M).findall(s))#['北京']
print(re.compile(r'Hello$',flags=re.M).findall(s))#['Hello']
X == VERBOSE 为正则添加注释 (太麻烦 不常用)
 
posted @ 2022-06-13 17:04  30度以南  阅读(18)  评论(0)    收藏  举报