0
点赞
收藏
分享

微信扫一扫

(四)、Python之正则表达式(re)

三分梦_0bc3 2022-03-20 阅读 74
python

文章目录

一、正则表达式中元素

  正则表达式是一个特殊的字符序列,它能帮助我们方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式
  在正式接触re模块前,先了解与正则表达式相关的一些辅助字符:原子、元字符、(非)贪婪量词、锚位、择一匹配、分组等。

  • 原子:正则表达式中实现匹配的基本单位,也称字符;
原子表(仅匹配一个)含义
\d匹配任意一个数字,等价于字符集[0-9]
\s匹配任意一个空白符,等价于字符集[\t\n\r\f ]
\w匹配任意一个数字、字母和下划线,等价于[A-Za-z0-9_]
\D匹配非数字字符
\S匹配非空白字符
\W匹配非单词字符
  • 元字符:正则表达式中具有特殊含义的字符;
(贪婪)数量元字符含义贪婪量词含义
星号(*)匹配符号前面的条目0~任意次*?匹配的字符串越短越好
.*匹配任意字符0~任意次(换行符除外).*?匹配的字符串越短越好
加号(+匹配符号前面的条目1~任意次+?匹配的字符串越短越好
问号(?)匹配符号前面的条目0~1次??优先考虑0次的情况
花括号({ })指定具体的重复次数范围{ }?
{n,m}匹配n ~ m个{n,m}?优先匹配n次的情况
{n}匹配 n 个
{n,}匹配 n ~ 任意个{n,}?优先匹配n次的情况
{,m}匹配 0 ~ m个{,m}?优先匹配0次的情况
  • 锚位:主要用来锁定被收索的字符串首尾
锚位字符含义
脱字符(^)锚位\A表示字符串开头锚位(在字符集方括号中做取反用)
美元符($)锚位\z表示字符串结尾锚位

【注】:python的正则表达式(字符)基础语法与perl的大致相同,详细语法规则参考perl的正则表达式语法介绍

二、python中正则表达式用法(re)

  re 模块使 Python 语言拥有全部的正则表达式功能,他提供了多种正则表达式处理函数以方便我们使用:

  • re.compile() 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
  • re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None。
  • re.search() 扫描整个字符串并返回第一个成功的匹配。
  • re.sub() 用于替换字符串中的匹配项。
  • re.findall() 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
  • re.finditer() 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
  • re.split() 方法按照能够匹配的子串将字符串分割后返回列表。

【注】:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配;
【注】:match 和 search 是匹配一次,findall 匹配所有

#!/usr/bin/python

import re

#(一)、compile()函数——将正则表达式转换成内部格式,提高代码执行效率
str="python666java"

#pat=r"\d+"
pat=re.compile(r"Python", re.I)                   #模式修正符——忽略大小写(re.I)

#print(re.search(pat,str))                        #效率低
print(pat.search(str))                            #效率较高

#(二)、match()/search()函数——匹配开头/匹配任意位置,单次匹配,匹配到之后就不会再进行匹配了
str1="pythonjavahtmljs"
str2="javapythonjavahtmljs"

pat1=re.compile(r"java")

print(pat1.match(str1))                            #匹配开头,匹配不到返回None,str1开头为python
   #打印:None
print(pat1.match(str2).group())                    #group()返回匹配到的内容 
   #打印:Java

print(pat1.search(str1).group())                   #匹配任意位置
   #打印:Java

#(三)、findall()函数——查找所有匹配的内容,返回到一个列表中
str3="hello....hello----hello------hello--hello----hello"

pat3=re.compile(r"hello")

print(pat3.findall(str3))
   #打印:["hello","hello","hello","hello","hello","hello"]

#(四)、finditer()函数——查找所有匹配的内容,装到一个迭代器中(效率高于findall())
str4="hello....hello----hello------hello--hello----hello"

pat4=re.compile(r"hello")

data=pat4.finditer(str4))

list1=[]
for i in data:
	list1.append(i.group())
print(list1) 
   #打印:["hello","hello","hello","hello","hello","hello"]

#(五)、split()函数——按照能够匹配的子串将字符串分割后返回列表
str5="Tom,,,,Bob,,,,,,john,,bill"

pat5=re.compile(r",+")                            

result=pat5.split(str5)
print(result)
   #打印:["Tom","Bob","John","Bill"]

#(六)、sub()函数——用于替换指定的目标字符串
str6="hello 123, hello 456!"

pat6=re.compile(r"\d+")

result1=pat6.sub("666",str6)
print(result1)
   #打印:hello 666, hello 666!

参考:https://www.runoob.com/python/python-reg-expressions.html

举报

相关推荐

0 条评论