浅言-正则匹配

所谓正则表达式,就是将字符串抽象化后表达出来的方法。

1、正则匹配

判断字符串是否符合正则的模式,查看是否匹配的过程被称为正则匹配。进行正则匹配的话需要用到match()函数。

import re   #为了进行正则匹配,引入re模块
s = 'Learn python'    
a = re.match('Le',s)   
if a:
    print(a.group())   #group()方法从匹配对象中将匹配的字符串取出来

输出结果:Le

匹配对象为a,match()函数中第一参数中的模式如果跟第二参数中的字符串匹配的话,会将具有匹配信息的对象返回,不符合则返回None。

然而,利用了match()函数的正则匹配是从字符串开头开始评价的。即使在字符串中间找到了匹配的字段,也不会被视为匹配。
如果把刚刚“Le”的地方改成“py”,那么结果就不会显示出来。

如果想要中途匹配的话,需要用search()函数。用法与match()相同。

a = re.search('py',s)   
方法 用途
a.start() 从匹配了的字符串中提取首字母
a.end() 从匹配了的字符串中提取末尾索引加1后所对应的那个字符
a.span() 将上述索引对应的元素作为元组获取

2、模式转译

在相同的模式下,想要评价各种字符串的不同,可以通过制作好进行了模式转译的正则表达对象实现快速匹配。

import re
s = 'Learn python'
b=re.compile('Le') #将模式转译后返回给正则表达对象b
a=b.match(s)  #利用正则表达对象的match()方法看是否匹配
if a:
    print(a.group())

结果:Le

3、大写字符和小写字符的区别

想要不区分大小写进行匹配时,要用以下形式

#没转译
a = re.match('Le',s,re.IGNORECASE)
#有转译
b = re.compile('Le',re.IGNORECASE)

4、最短匹配和最长匹配

在没有使用规定重复次数的特殊字符*、+、?、{n,}、{n,m}的情况下,符合模式的字符串中最长的字符串会被匹配(最长匹配),在这些特殊字符的后面添加一个“?”,就会跟最短的字符串相匹配(最短匹配)。

re.match('L.*n','Learn Python').group()
re.match('L.*?n','Learn Python').group()

结果:
‘Learn Python’
‘Learn’

5、获取所有匹配的字符串

使用findall() 函数可以获取所有与模式相匹配的字符串。

import re
s = 'Learn Python'
mlist = re.findall('.n',s)
print(mlist)

.n表示任意一个字符+“n”的意思。
结果:[‘rn’, ‘on’]

6、获得所有匹配的字符串及其位置信息

如果同时还想获得相关的位置信息的话,需要使用finditer() 函数。finditer()函数可以将符合的字符串的位置作为返回值返回。iter在中文中被称为迭代器。

import re
s = 'Learn Python'
miter = re.finditer('.n',s)
for mobj in miter:
    print(mobj.group())
    print(mobj.span())

结果:
rn
(3, 5)
on
(10, 12)

7、正则表达中的替换

sub() 函数来替换正则表达中的字符串。
‘[A-Z].{2}’ 这是检索的模式,表示大写的英文字母加上任意两个字符。‘替换’ 为替换后的字符串。

import re
s1 = 'I love Python'
s2 = re.sub('[A-Z].{2}','替换',s1)
print(s2)

结果:替换ove 替换hon

8、用正则表达式进行分割

split() 函数可以将字符串分割。
‘.n’ 为被检索的模式,表示任意的一个字符+‘n’ 的形式。

import re
s = 'Learn Python,Mareyan'
mlist = re.split('.n',s)
print(mlist)

结果:[‘Lea’, ’ Pyth’, ‘,Mareyan’]

9、小案例-调查密码的形式

规定密码为下述形式,并确认输入的字符串形式是否符合下述规定:

  • 只可以使用半角英文和英文数字以及_(下划线)
  • 首字母为半角英文字母
  • 3个字符以上8个字符以下
import re
while True:
    s=input('密码>')
    if s==' ':
        break
    mobj = re.match('^[a-z][a-z0-9_]{2,7}$',s,re.IGNORECASE)
    if mobj:
        print('密码形式正确。')
    else:
        print('密码形式不正确。')

欢迎大家多交流讨论~[抱拳]

上一篇:MyBatis通用 Mapper4使用小结


下一篇:replace,replaceAll无效