python 正则表达式基本用法

1.基础

1.1单字符

直接给出字符,属于精确匹配。如:

\d : 匹配数字

\D:匹配非数字

\w : 匹配字母或者数字或者下划线

\W:匹配非字母或者数字或者下划线

\s : 匹配任意的空白符(空格、换行、回车、制表、换页)

\S:匹配任意的非空白符

1.2边界字符

^:行首匹配

$:行尾匹配

\A:匹配字符串开始,和^的区别是\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配它行的行首

\Z:匹配字符串结束,和$的区别是\Z只匹配整个字符串的结尾,即使在re.M模式下也不会匹配它行的行尾

\b:匹配单词的边界,也就是指单词和空格间的位置,比如:'od\b'可以匹配god,不能匹配godman

\B:匹配非单词边界,od\b'可以匹配godman,不能匹配god

1.3匹配多个字符

(xyz)匹配小括号内的xyj

 x? 匹配0个或者1个x

x*匹配任意个x,(.*表示匹配0个或者任意多个字符(换行符除外)

x+匹配至少一个x

x{n}匹配确定的n个x

x{n,}匹配至少n个x

x{n,m}匹配n-m个x

x | y 匹配x或y

1.4特殊用法

*?    +?   x?  最小匹配,通常都是贪婪匹配,可以使用这种解决贪婪匹配            

[^jack]表示匹配除了jack以外的所有字符,[]中的^称为脱字符

 

 

3. re模块

python的r前缀可让系统认为字符串不需要转义,使用Python的r前缀,就不用考虑转义的问题。

re模块使得python拥有了全部的正则表达式功能

该模块可用于判断判断正则表达式是否匹配,如果匹配,则返回一个Match对象,否则返回None。

一般使用正则表达式时,会先使用re模块进行编译,当编译没问题后,便可进行使用:

>>> import re
# 编译:
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
# 使用:
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')

re的子模块常见以下:

re.match:从头开始匹配,若开始没有匹配上则返回none

re.search:扫描整个字符串,并返回第一个成功的匹配

re.findall:扫描整个字符串,并返回结果列表

re.finditer:扫描整个字符串,返回一个迭代器

re.sub:返回一个被替代的字符串

re.subn:返回一个元祖,第一个元素表示被替换的字符串,第二个元素表示被替换的次数

 

4.正则表达式的其它用途

4.1切分字符串

例:

>>> re.split(r'\s+', 'a b   c')
['a', 'b', 'c'
>>> re.split(r'[\s\,]+', 'a,b, c  d')
['a', 'b', 'c', 'd']
>>> re.split(r'[\s\,\;]+', 'a,b;; c  d')
['a', 'b', 'c', 'd']

4.2分组

例:

>>> t = '19:05:30'
>>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
>>> m.groups()
('19', '05', '30')
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'

 

 

5.正则表达式的特性(贪婪匹配)

例:

>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')

由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

 

>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值