正则表达式(Python3-re模块示例)

本文详细介绍了正则表达式的基本语法,包括各种元字符的作用,如.、^、$、*、+、?、{m}

1.常用的正则表达式

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1
'*'     匹配*号前的字符0次或多次, re.search('a*','aaaabac')  结果'aaaa'
'+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?'     匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次
'{m}'   匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group()  匹配到'bbb'
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45' 

'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
'\Z'    匹配字符结尾,同$ 
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?P<name>...)' 分组匹配

 

 

2.re模块

re.match(pattern, string[, flags]) 从头开始匹配
re.search(pattern, string[, flags]) 匹配包含
re.findall(pattern, string) 把所有匹配到的字符放到以列表中的元素返回
re.split(pattern, string[, maxsplit=0) 以匹配到的字符当做列表分隔符
re.sub(pattern, replace, string[, count=0] 匹配字符并替换
re.fullmatch 全部匹配

 

2.1 简单例子
>>> import re
>>> s = 'abc1d3e'
         re.match
>>> print(re.match('[0-9]', s))
None
>>> re.match('[0-9]', '1bdfd')
<_sre.SRE_Match object; span=(0, 1), match='1'>
         re.search
>>> re.search('[0-9]', s)
<_sre.SRE_Match object; span=(3, 4), match='1'>

>>> re.search('[0-9]', s).group()
'1'

# span是类似于切片的索引
         re.findall
>>> re.findall('[0-9]', s)
['1', '3']
          re.split
>>> re.split('d', s)
['abc1', '3e']>>> s2 = 'alex99jack88rain77jinxin50'
>>> re.split('\d+', s2)
['alex', 'jack', 'rain', 'jinxin', '']
          re.findall
>>> s1 = 'aabbaa123'
>>> re.findall('a', s1)
['a', 'a', 'a', 'a']

>>> re.findall('\d+', s2)
['99', '88', '77', '50']

           re.sub
>>> re.sub('a', 'c', s1)
'ccbbcc123'

 

 

3.其他正则表达式

分组匹配
>>> import re
>>> s='alex123'
>>> re.search('([a-z]+)([0-9]+)', s).group()
('alex123')
>>> re.search('([a-z]+)([0-9]+)', s).groups()
('alex', '123')

 

>>> re.search('\d', s)
<_sre.SRE_Match object; span=(4, 5), match='1'>
>>> re.search('\d+', s)
<_sre.SRE_Match object; span=(4, 7), match='123'>
>>> re.search('\D+', s)
<_sre.SRE_Match object; span=(0, 4), match='alex'>
另外一种分组匹配
>>> s1 = '130704200005250613'
>>> re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})', s1).groupdict()
{'province': '130', 'city': '704', 'born_year': '2000'}
复杂一点的re.sub
>>> re.sub('\d+','_', s3)
'alex_jack_rain_\\jinxin_|mac-oldboy'
>>> re.sub('\d+','_', s3, count=2)
'alex_jack_rain77\\jinxin50|mac-oldboy'
re.split
>>> s2 = 'alex99jack88rain77jinxin50#mac-oldboy'
>>> re.split('\d+|#|-', s2)
['alex', 'jack', 'rain', 'jinxin', '', 'mac', 'oldboy']
>>> s4 = '9-2*5/3+7\3*99/4*2998+10*568/14'
>>> re.split('[-\*/+]', s4)
['9', '2', '5', '3', '7\x03', '99', '4', '2998', '10', '568', '14']
>>> re.split('[-\*/+]', s4, maxsplit=2)
['9', '2', '5/3+7\x03*99/4*2998+10*568/14']
re.fullmatch
 
>>> re.fullmatch('alex123', 'alex123')
<_sre.SRE_Match object; span=(0, 7), match='alex123'>
>>> re.fullmatch('\w+@\w+\.(com|cn|edu)', 'alex@oldboyedu.com')
<_sre.SRE_Match object; span=(0, 18), match='alex@oldboyedu.com'>
re.compile(pattern[,flags])根据包含正则表达式的字符串创建模式对象
>>> pattern = re.compile('\w+@\w+\.(com|cn|edu)')
# 如果需要多次的匹配,建议首先把pattern用compile方法转化,这样解释器就不需要每次都转化了。
>>> pattern.fullmatch('alex@oldboyedu.cn')
<_sre.SRE_Match object; span=(0, 17), match='alex@oldboyedu.cn'>

 

4.Flags标志符

  • re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
  • M(MULTILINE): 多行模式,改变'^'和'$'的行为
  • S(DOTALL): 改变'.'的行为,make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.
  • X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样
a = re.compile(r"""\d + # the integral part
                \. # the decimal point
                \d * # some fractional digits""", 
                re.X)

b = re.compile(r"\d+\.\d*")

其他的例子

>>> re.search('a', "Alex", re.I)
<_sre.SRE_Match object; span=(0, 1), match='A'>

>>> re.search('foo.$', 'foo1\nfoo2\n')
<_sre.SRE_Match object; span=(5, 9), match='foo2'>
>>> re.search('foo.$', 'foo1\nfoo2\n', re.M)
<_sre.SRE_Match object; span=(0, 4), match='foo1'>

>>> print(re.search('.', '\n'))
None
>>> re.search('.', '\n', re.S)
<_sre.SRE_Match object; span=(0, 1), match='\n'>

>>> print(re.search('.  #test', 'alex'))
None
>>> re.search('.   #test', 'alex', re.X)
<_sre.SRE_Match object; span=(0, 1), match='a'>

转载于:https://www.cnblogs.com/haoqirui/p/9969730.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值