Python正则re模块学习笔记

简介: Python正则re模块学习笔记

re正则处理


正则定义


正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。


常用正则表达式的方法


  • re.compile(编译)
  • pattern.match(从头匹配)
  • pattern.search(匹配一个)
  • pattern.findall(匹配所有)
  • pattern.sub(替换)


特殊字符集


特殊字符 解释
. 匹配除换行符之外的任何字符
^ 匹配字符串的开头
$ 匹配字符串的结尾
* 匹配前面的字符0次或更多次,尽可能多的重复,ab*将匹配’a’,’ab’或者a后面加任意数量的b
+ 匹配前面的字符一次或更多次,ab+将匹配’ab’后加任意数量的b
? 匹配前面的字符0次或一次,ab将匹配’a’或’ab’
*?,+?,?? *,+,?都属于贪婪匹配,就是尽可能多的匹配,而有时我们希望以最少的模式匹配,可以在限定符之后加?表示以最少的方式匹配
{m} 匹配前一个字符至少m次
{m,n} 匹配前一个字符最少m次,最多n次
{m,n}? 以非贪婪模式匹配前一个字符,最少m次,最多n次,并以尽可能少的方式匹配
\ 转义字符,将\后面的字符进行转义
[] 表示一组字符,字符可以单个列出,也可以给定范围,如[abc]表示a或b或c,[a-z]表示26个小写字母中的任意一个,[^a-z]匹配非小写字母,[0-5][0-9]表示匹配00-59,特殊字符在[]也失去特殊意义,[(+ )]将匹配任何文字字符的’(‘,’)’,’+’,’
|
AB 匹配A或者B
() 匹配括号内的正则,每个括号都是一个组,从左往右的括号,编号依次加一
\A 匹配字符串的开头
\b 只用以匹配单词的词首和词尾(退格符)
\B 只在当前位置不在单词边界时匹配。
\d 匹配任何Unicode的十进制数字,与[0-9]相同
D 匹配任何非十进制的字符,与[^0-9]相同
\s 匹配Unicode的空白字符,匹配ascii字符集中包含空格的字符,相当于[\t\n\r\f\v]
\S 匹配不是空白字符的字符,相当于[^\t\r\n\f\v]
\w 匹配字母数字下划线,相当于[a-zA-Z0-9_]
\W 匹配非字母数字下划线,相当于[^a-zA-Z0-9]
\Z 仅匹配字符串结尾
(?P<name>) 给分组加一个别名,(?P<a>)给分组取别名为a,每个组名只能在正则表达式中定义一次
(?P=name) 引用前面别名为name的分组匹配到的任何文本
(?<=) 前向界定,表示你要匹配的字符串前面是某个字符串的时候才匹配,(‘(?<=abc)def’,’abcdef’)当def前面是abc的时候才匹配
(?=) 后向界定,表示你要匹配的字符串后面是某个字符串的时候才匹配,(‘abc(?=def)’,’abcdef’)
(?<!) 非前向界定,表示你要匹配的字符串前面不是某个字符串的时候才匹配,(‘(?<=abc)def’,’abcdef’)当def前面不是abc的时候才匹配
(?!) 非后向界定,表示你要匹配的字符串后面不是某个字符串的时候才匹配,(‘abc(?=def)’,’abcdef’)
(?(id/name)yes-pattern no-pattern)


正则表达式方法


  • re.compile(pattern,flags=0)


编译一个正则表达式模式为正则表达式对象,其可用于使用他的匹配match(),search()以及其他方法


>>> comp=re.compile(r'\d+')>>> ret=comp.match('123456')>>> ret.group()'123456'


  • 相当于


ret=re.match(r'\d+','123456')


  • re.search(pattern,string,flags = 0)
    查找正则表达式匹配到的第一个位置,并返回相应的匹配对象
  • re.match(pattern,string,flags = 0)
    从字符串的开头匹配,并返回相应的匹配对象
  • re.fullmatch(pattern,string,flags = 0)
    将会对整个字符串进行匹配,并返回相应的匹配对象
  • re.split(pattern,string,maxsplit = 0,flags = 0)
    按照正则匹配模式进行拆分字符串,maxsplit为最多拆分次数,并且字符串的其余部分将作为列表的最后一个元素返回,如果分隔符中有捕获组并且它在字符串的开头或者结尾匹配,则结果将以空字符串开头。


>>> re.split(r'\W+','Words words wordS')
['Words', 'words', 'wordS']>>> re.split(r'\W+','Words words wordS',1)
['Words', 'words wordS']>>> re.split(r'\d+','1q2W3e4R',flags=re.IGNORECASE)
['', 'q', 'W', 'e', 'R']>>> re.split(r'(\W+)', 'words, words...')
['words', ', ', 'words', '...', '']>>> re.split(r'\W+', 'words, words...')
['words', 'words', '']


  • re.findall(pattern,string,flags=0)
    从左往右匹配,返回一个列表,如果模式中存在一个或多个组,则返回组列表; 如果模式有多个组,这将是一个元组列表。结果中包含空匹配。


>>> re.findall(r'\d+','123,456')
['123', '456']>>> re.findall(r'(\d+)(\w+)','123qw,werrc')
[('123', 'qw')]>>> re.findall(r'(\d+)|(\w+)','123qw,werrc')
[('123', ''), ('', 'qw'), ('', 'werrc')]


  • re.finditer(pattern,string,flags = 0 )
    返回一个匹配到每个结果的迭代器


>>> for i in re.finditer(r'\d+','123456'):
  print(i.group())123456


  • re.sub(pattern,repl,string,count = 0,flags = 0 )
    将匹配到的字符串替换成repl的值,count表示要替换的模式最多替换次数,repl可以是一个字符串也可以是一个函数,当repl为字符串时,会处理其中的任何反斜杠,,可以使用\id或\g< id>、\g< name>引用分组


>>> re.sub(r'(\d+) (\w+)',r'\2 \1','12345 asdfd')'asdfd 12345'


  • 当repl是一个函数时,那么这个函数会只接受一个匹配对象参数。例如:


>>> def mat(m):
    if m.group(2)=='1234':        return m.group(1)    else:        return '1234'>>> re.sub(r'(\d+) (\d+)',mat,'123 1234qer')'123qer'>>> re.sub(r'(\d+) (\d+)',mat,'123 123qer')'1234qer'


  • re.subn(pattern,repl,string,count = 0,flags = 0 )
    与sub执行的操作相同,但是返回的是元组,元组最后一个元素为替换次数


>>> def mat(m):
  if m.group(2)=='1234':      return m.group(1)  else:      return '1234'>>> re.subn(r'(\d+) (\d+)',mat,'as123 1234qer')
('as123qer', 1)


  • 正则表达式对象
    使用re.compile可以编译一个正则表达式对象


  • regex.search(string[,pos[endpos]])
    查找正则表达式匹配到的第一个位置,并返回相应的匹配对象可选参数pos和endpos表示设置正则表达式匹配的字符串开始位置和结束位置


>>> pattern=re.compile(r'\d+')>>> pattern.search('123456',2,5).group()                   
'345'


  • regex.match(string,posendpos)
    如果字符串开头的零个或多个字符与此正则表达式匹配,则返回相应的匹配对象。pos和endpos用法和regex.search()意思相同
  • 编译的正则表达式的方法和属性与正则匹配的函数相同,这里不一一说明
    编译对象的常用参数
  • re.A(re.ASCII)
    使\w,\W,\b,\B,\d,\D,\s和\S只匹配ASCII字符,而不匹配Unicode字符
  • re.I(re.IGNORECASE)
    匹配时不区分大小写
  • re.L(re.LOCALE)’
    使\w \W \b \B \s \S \d \D和区分大小写的匹配只取决于当前的环境设定
  • re.M(re.MULTILINE)
    多行模式下,’^’和’$’由原来匹配字符串的开头或者结尾变成匹配每行的开头和结尾
  • re.S(re.DOTALL)
    使’.’匹配包含换行符的任何字符
  • re.X(re.VERBOSE)
    这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的


a = re.compile(r"""\d +  # the integral part
                 \.    # the decimal point
                 \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")


match对象


  • match.group([ group1,… ] )
    返回匹配的一个或多个子组,如果只有一个参数,则结果为单个字符串; 如果有多个参数,则结果是一个元组,每个参数有一个项目。如果没有参数,group1默认为零(返回整个匹配)。 如果groupN参数为零,则相应的返回值是整个匹配的字符串


>>> s=re.match(r'(\w+) (\w+)','hello world')>>> s.group(0)'hello world'>>> s.group(1)'hello'>>> s.group(2)'world'>>> s.group(1,0)
('hello', 'hello world')


  • 如果分组太多,我们可以对分组进行命名


>>> m=re.match(r"(?P<first>\w+) (?P<second>\w+)",'hello world')>>> m.group('first')'hello'>>> m.group('second')'world'


  • 如果一个组匹配多次,那么最终将返回的最后一次匹配到的字符串


>>> m=re.match(r'(\d)+','123456')>>> m.group()'123456'>>> m.group(1)'6'


  • match. getitem(g)
    与m.group(g)相同,这样使用会更简单


>>> m=re.match(r'(\d)+','123456')>>> m[0]'123456'>>> m[1]'6'


  • match.groups(default=None)
    以元组的形式返回匹配到的所有子组,没有被匹配到的分组,默认为None,当然可以设置默认参数


>>> m=re.match(r'(\d+),(\w+)?','1234,')>>> m.groups()
('1234', None)>>> m.groups('0')
('1234', '0')


  • match.groupdict(default=None)
    以字典的形式返回匹配到的值,字典的键为分组名,值为匹配到的字符串,没有匹配到的分组将设置为None


>>> m=re.match(r'(?P<first>\d+) (?P<second>\d+)','123 456')>>> m.groupdict()
{'first': '123', 'second': '456'}>>> m=re.match(r'(\d+) (\d+)','123 456')>>> m.groupdict()
{}


  • match.start([group]) 和match.end([group])
    分别返回由分组匹配到的字符串的开始和结束的索引,结束字符串的索引为最后一个子符的索引加一group默认为零,将会表示所有匹配到的字符串


>>> m=re.match(r'(\w+) (\w+) (\w+) (\w+)','my name is wanger')>>> m.start(2)                   
3>>> m.end(2)                   
7>>> m.end()                   
17>>> m.start()                   
0


  • match.span[group]
    返回一个二元组,元组的元素为分组匹配到的字符串开始的索引和结束的索引,group默认为0,表示匹配到的所有字符串


>>> m=re.match(r'(\w+) (\w+) (\w+) (\w+)','my name is wanger')>>> m.span(2)                       
(3, 7)>>> m.span()                   
(0, 17)


  • match.pos 和match.endpos
    分别返回要匹配字符串的开始搜索的索引和结束搜索的索引


>>> m=re.match(r'(\w+) (\w+) ','my name is wanger')>>> m.pos                   
0>>> m.endpos                   
17


  • match.lastindex
    最后匹配到的分组的索引


>>> m=re.match(r'(\w+) (\w+) ','my name is wanger')>>> m.lastindex                   
2>>> m=re.match(r'(\w+) (\w+) (\w+)','my name is wanger')                       
>>> m.lastindex                       
3


  • match.lastgroup
    最后匹配到的分组的名称,没有命名组则返回空


>>> m=re.match(r'(\w+) (?P<last>\w+) ','my name is wanger')                   
>>> m.lastgroup                   
'last'


几个简单的实例


  1. 匹配前面是数字123的字符


>>> re.search(r'(?<=123)\w+','123asd,wer').group(0)    
'asd'


2.匹配前面是数字后面是下划线的字符


>>> re.search(r'(?<=123)\w+(?=_)','123asd_123wer').group(0)   
'asd'


3.匹配手机号码


>>> re.match(r'1[3,5,7,8]\d{9}|','13573528479').group()                   
'13573528479'


4.匹配电话号码


>>> re.match(r'\d{3}-\d{8}|\d{4}-\d{7}','0531-82866666').group()      '0531-8286666'


5.匹配IP地址


>>> re.match(r'\d+\.\d+\.\d+\.\d+','192.168.10.25').group()         
'192.168.10.25'


6.匹配网易邮箱


>>> re.findall(r'\w+@163\.com|\w+@126\.com','wanger@163.com wanger@126.com')
['wanger@163.com', 'wanger@126.com']


7.匹配HTML文本


>>> re.match(r'<(\w*)><(\w*)>.*</\2></\1>','<body><h2>wahaha5354</
相关文章
|
2月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
76 4
|
1月前
|
Python
Python Internet 模块
Python Internet 模块。
125 74
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
130 63
|
2月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
2月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
18天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
26 3
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
2月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
56 5
|
2月前
|
JavaScript 前端开发 Python
python中的OS模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术及全栈开发经验,持续更新中,期待您的关注和支持!🎉🎉🎉
47 0
|
2月前
|
JavaScript 前端开发 Python
python中的platform模块的基本使用
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。博客分享前端技术,助你成长。关注我,持续更新中!🎉🎉🎉
37 0

热门文章

最新文章