python的正则表达式模块--re

      import re

            语法:
                re.match(pattern, str,flag)
                参数:match:表示只从字符串的开始处开始匹配,如果没有匹配上则返回None,匹配上返回一个match对象,可以使用match对象.group()函数取到匹配成功的字符串。
                           pattern:正则表达式的规则
                           str:表示需要匹配的字符串
                           flag:标记,可以不写

                re.search(pattern, str,flag)  寻找整个字符串,查找匹配项,返回第一个匹配项,返回的类型为一个match对象,可以使用group()函数取到匹配到的值,若没有匹配到,则会报错
                re.findall(pattern, str,flag)   找到字符串中所有匹配项,返回一个列表套元组类型,若没有匹配到则返回一个空列表。

匹配单个字符与数字:
. :表示可以匹配除了换行符(\f\n\r\t)之外任意的单个字符
[245] :表示匹配括号中任意一个字符(即匹配2或4或5)
[0-9] :表示匹配0到9范围内任意一个数字(相当于\d)
[a-z] :表示匹配到a到z范围内任意一个小写字母
[A-Z] :表示匹配A到Z范围内任意一个大写字母
[0-9a-zA-Z]:表示匹配任意一个数字或字母(中间不加逗号)(相当于\w)
[0-9a-zA-Z_]:表示匹配任意一个数字或字母或下划线
[^a-z]:表示除了a到z之外任意一个字符
\D : 表示除了数字外任意一个字符
\W:表示除了数字,字母下划线外任意一个字符
\S :表示除了特殊字符以外的任意符号(特殊符号包括空格’ ’,换页’\f’,换行’\n’,回车’\r’,制表’\t’)
\s:匹配任意空白字符,等价于[ \t \n \r \f ]

边界字符:
定义:用来表述字符的边界,包括字符的开始,结束和是否是单词的结束。

    ‘M’模式表示多行匹配       re.M
    ’S’模式表示包括换行符在内的所有字符    re.S
    ‘I’模式不区分大小写    re.I

    ^ : 行首匹配,在’M’模式下,会匹配新一行的行首(注意:与[^]意义不同)
    $ : 行尾匹配,在’M’模式下,会去匹配新一行的行尾
    \A : 表示行首,只匹配整个字符串的开头,在’M’模式下不会匹配其他行的行首
    \Z : 表示行尾,只匹配整个字符串的末尾,在’M’模式下不会匹配其他行的行首
    \b : 表示匹配英文单词的边界,指的是单词和空格间的位置
    \B : 表示匹配非英文单词边界

匹配一定个数的字符:(假设:x,y,z表示任意的字符,m,n表示正整数)
x?:表示0个或者1个x
x* :表示可以匹配0个或者多个x(例如:*表示匹配0个或者多个除了换行符之外的字符)
x+:表示匹配至少1个x(例如:.+ 表示匹配至少1个除了换行符之外的字符)
(xyz): 表示将x,y,z看成一个整体
x{n} :表示n个x
x{n,} :表示最少匹配n个x
x{n,m} : 表示至少有n个,最多有m个x
x | y :表示x或者y

Compile

—将正则表达式编程成一个正则对象,提高运行效率

import re
pattern = re.compile('[a-zA-Z]')
result = pattern.findall('as3SiOPdj#@23awe')
print result
# ['a', 's', 'S', 'i', 'O', 'P', 'd', 'j', 'a', 'w', 'e’]

同样:sub、match、group都适用

split分割,sub 与 subn区别:

import re

s = '90hello1234disen96758what8899go768hi234'

# 分割
sn = re.split('[a-z]+',s)  # 返回一个列表
# 清洗数据
sn = list(filter(lambda x: x != '',sn))
print(sn)


# 替换  将所有字母变成逗号
s_ = re.sub('[a-z]+',',',s)  # 返回一个替换后的字符串
s_2 = re.subn('[a-z]+',',',s)   # 返回一个元组,第一个位置是替换后的字符串,第二个位置是替换的次数
print(s_)
print(s_2)

结果:

['90', '1234', '96758', '8899', '768', '234']
90,1234,96758,8899,768,234
('90,1234,96758,8899,768,234', 5)

例:sub第二个参数可以为一个自定义函数

import re
# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)

s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))

运行结果:
A46G8HFD1134

group、groups、groupdict

import re

s = '010-88593829'

#带分组名
r2 = re.match('(?P<first>\d{3})-(?P<last>\d{8})',s)
print(r2)
print(r2.group())
print(r2.groups())  # 返回元组
print(r2.groupdict())   # 返回字典,前提在匹配的正则中通过?P<name>指定分组名

# 练习:从给定的字符串中读取到姓名和手机号
ss = '<h1>disen</h1>
<span>手机号:17793457782</span>'
ss_1 = 'disen:18873473382'
r3 = re.match('(\w+):([1][3-9]\d{9}$)',ss_1)
print(r3.group())
print(r3.groups())

# .*表示任意多个字符
r3_ = re.match('<h1>([a-zA-Z]+)</h1>.*<span>.*:([1][3-9]\d{9})</span>',ss)
print(r3_.groups())

结果:

<_sre.SRE_Match object; span=(0, 12), match='010-88593829'>
010-88593829
('010', '88593829')
{'first': '010', 'last': '88593829'}
disen:18873473382
('disen', '18873473382')
('disen', '17793457782’)

findall

import re

s = 'hello,disen,phone is 17791692095,is18766355533'

result = re.findall('([a-z]{2})([1][3-9]\d{9})',s)
print(type(result))  # 返回list
print(result)
查找图片地址 src的属性值
s_ = '''
<img src="cc.jpg" width=400 height=300>
<img src="fc.jpg" width=500 height=700>
<img src="yc.jpg" width=600 height=3200>
<img src="ec.jpg" width=200 height=3600>
<img src="nc.jpg" width=700 height=700>
'''

img = re.findall(‘src=”(.*)” width=(\d+) height=(\d+)’,s_)
print(img) # 返回list,每个元素是一个元组
print()

结果:
[(‘cc.jpg’, ‘400’, ‘300’), (‘fc.jpg’, ‘500’, ‘700’), (‘yc.jpg’, ‘600’, ‘3200’), (‘ec.jpg’, ‘200’, ‘3600’), (‘nc.jpg’, ‘700’, ‘700’)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值