Python正则

45 阅读3分钟

正则

一些特殊符号及文本组合在一起的用来描述字符或字符串的一些规则,叫做正则

常用来通过特殊文本匹配某些文本信息

正则中的特殊符号

匹配一个范围[] [A-Z]:A, B, C… [0-9]:1, 2, 3…


匹配任何数字字符\d \d:1, 2, 3…


匹配任何空白符\s \s:\t (水平制表), \v (垂直制表), \n (换行), \r (回车), \f (换页)


匹配任何数字、字母、字符及下划线\w \w: a, 1, _


匹配除了换行符任意一个单个字符. a**.c:abc, a2c, a_c ..**:匹配任意字符组成的两个长度的字符串


匹配前面出现的正则表达式0次或多次 a*:aaa 或是一个空 [abc]:aaabbb abc bbaacc


匹配前面出现的正则表达式0次或一次? a?:a 或是一个空


匹配前面出现的正则表达式1次或多次+ a+:aaa a abc+:abcabc


匹配前面出现的正则表达式固定次数{} a{5}: aaaaa \d{5}:12345, 22222


匹配明确的多个选择| a | b:a, b abc|cdf|123:abc, cdf, 123


匹配字符串的开头或结尾^、$

abc$:匹配所有以abc结尾的字符串


否定匹配[^] [^a]:匹配除了a之外的所有字符


re模块函数

  • 编译正则表达式
re.compile(pattern)

一般的,特殊字符再进行正则匹配的时候,如果你不预先编译正则表达式,解释器也会在你传入参数的时候进行编译 一些常用正则表达式,我们可以提前使用该函数进行预先编译,提高程序的效率

>>> import re
>>> regex = re.compile('abc')

  • 尝试使用正则模式pattern在字符串中的开头进行严格匹配,如果开头匹配失败则匹配失败
re.match(pattern,string)
  • 匹配成功:返回一个匹配对象,匹配到的值可通过group函数获
  • 匹配失败:返回None
>>> res = re.match('abc','abcac')
<_sre.SRE_Match object; span=(0, 3), match='abc'> #返回表示选择的区间以及匹配到的结果
>>> >>> res.group()
'abc'

  • 返回字符串中正则模式的所有非重复出现
re.findall(pattern,string)
>>> re.findall('\*','a*b*c*')
['*', '*', '*']
  • 注意:由于匹配的表达式中,我希望匹配的只是单纯的*****号,并不具有特殊意义,所以要加一个斜杠防止转义

  • 返回字符串中正则模式的第一次出现,没有匹配结果则返回None,结果可以通过返回值的group函数获取
re.search(pattern,string)
>>> res = re.search('\*','a*b*c*')
<_sre.SRE_Match object; span=(1, 2), match='*'>
>>> res.group()
'*'

  • 进行字符串的搜索和替换
re.sub(str1,str2,str3)
re.subn(str1,str2,str3)
'''
str1: 要替换的字符串
str2: 替换成什么
str3: 在哪个字符串里进行替换
'''

这两个函数都可以实现搜索替换功能,均返回一个替换之后的新字符串 subn函数会以元组形式包含一个表示替换的总数

>>> var = re.sub('\*','_','a*b*c*')
>>> var
'a_b_c_'
>>> var = re.subn('\*','_','a*b*c*')
>>> var
('a_b_c_', 3)

贪婪非贪婪

如果问号?紧跟在任何使用闭合(类似*** + 这样的操作符)的匹配后面, 它将直接要求正则表达式引擎匹配尽可能少的次数,这叫做非贪婪**

贪婪匹配:正则表达式引擎将试图“吸收”匹配该模式的尽可能多的字符 非贪婪匹配:问号要求正则表达式引擎去**“偷懒”,如果可能,就在当前的正则表达式中尽可能少**地匹配字符,留下尽可能多的字符给后面的模式


>>> import re
>>> mystr = 'a*b*c*d*e*f*g'
>>> re.findall('.+?', mystr) #非贪婪模式进行匹配
['a', '*', 'b', '*', 'c', '*', 'd', '*', 'e', '*', 'f', '*', 'g']
>>> re.findall('.+', mystr) #贪婪模式进行匹配
['a*b*c*d*e*f*g']
>>> re.findall('.*', mystr) #贪婪模式进行匹配
['a*b*c*d*e*f*g', '']
>>> re.findall('.*?', mystr) #非贪婪模式进行匹配
['', '', '', '', '', '', '', '', '', '', '', '', '', ''] #结果不同在于对+号和*号特殊字符的解释