Python学习(正则表达式与模式匹配上篇)

一、用正则查找文本中相应的内容:

>>> import re
>>> phoneNumRegex = re.compile(r'\d\d\d \d\d\d\d \d\d\d')
>>> num = phoneNumRegex.search('我的电话是:010 1111 1111')
>>> print(num)
<_sre.SRE_Match object; span=(6, 18), match='010 1111 111'>
>>> print(num.group())
010 1111 111
1.import re 导入正则表达式模块。Python中所有正则表达式的函数都在re模块中,所以我们要先引入re模块;
2. re.compile() 函数创建一个 Regex 对象(参数就是要匹配的内容的正则表达式);
3. Regex 对象的 search() 方法来查找一段字符串,返回那个匹配的对象num,num中是一段相应的描述信息;
4.
调用匹配 对象num的 group() 方法,返回实际匹配文本的字符串。

当然,也可以使用()给查找的内容分组:

>>> phoneNumRegex = re.compile(r'(\d\d\d) (\d\d\d\d \d\d\d)')
>>> num = phoneNumRegex.search('my number is 010 1111 1111')
>>> num.group(1)
'010'
>>> num.group(2)
'1111 111'
>>> num.groups()
('010', '1111 111')
>>> num.group(0)
'010 1111 111'
>>> num.group()
'010 1111 111'

二、用管道匹配多个分组:管道是或者的关系。

>>> name = re.compile(r'Lee|Tony')
>>> names = re.compile(r'Lee|Tony')
>>> name = names.search('Lee and Tony')
>>> name.group()
'Lee'
如果 Lee和Tony都出现在被查找的字符串中,则第一次出现的匹配文本会被作为匹配对象返回。

三、用问号实现可选性的匹配

>>> phoneNumRegex = re.compile(r'(\d\d\d)? (\d\d\d\d \d\d\d)')
>>> num = phoneNumRegex.search('my number is 1111 1111')
>>> num.group()
' 1111 111'
>>> num = phoneNumRegex.search('我的电话是:010 1111 1111')
>>> num.group()
'010 1111 111'
四、 用星号匹配零次或多次,用加号匹配一次或多次:用花括号匹配特定次数

>>> names = re.compile(r'(Lee)*')
>>> name = names.search('LeeLee')
>>> name.group()
'LeeLee'
>>> names = re.compile(r'(Lee)+')
>>> name = names.search('Tony')
>>> name.group()
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    name.group()
AttributeError: 'NoneType' object has no attribute 'group'>>> names = re.compile(r'(Lee){3}')
>>> name = names.search('LeeLeeLee')
>>> name.group()
'LeeLeeLee'
>>> name = names.search('LeeLee')
>>> name.group()
Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    name.group()
AttributeError: 'NoneType' object has no attribute 'group'
五、 用花括号匹配特定次数:

>>> names = re.compile(r'(Lee){3}')
>>> name = names.search('LeeLeeLee')
>>> name.group()
'LeeLeeLee'
>>> name = names.search('LeeLee')
>>> name.group()
Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    name.group()
AttributeError: 'NoneType' object has no attribute 'group'
参数除了一个数字,还可以设定范围,即在花括号中写一个最小值、逗号、一个最大值。例如 (Lee){1,3}, 将匹配 'Lee' 'LeeLee' 'LeeLeeLee' 三种情况。也可以不写花括号中的第一个或第二个数字,这样的话将不限定最小值或最大值。

六、贪心和非贪心匹配:默认来讲是贪心的,就是取最多的那个,如果想取遇到的第一个,在{}后加上一个?来实现。

>>> names = re.compile(r'(Lee){1,3}')
>>> name = names.search('LeeLeeLee')
>>> name.group()
'LeeLeeLee'
>>> names = re.compile(r'(Lee){1,3}?')
>>> name = names.search('LeeLeeLee')
>>> name.group()
'Lee'
七、 findall()方法

>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d')
>>> phoneNum = phoneNumRegex.search('我的电话是:010-1111-1111和010-8888-8888')
>>> phoneNum.group()
'010-1111-111'
>>> phoneNum = phoneNumRegex.findall('我的电话是:010-1111-1111和010-8888-8888')
>>> phoneNum
['010-1111-111', '010-8888-888']
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d\d)-(\d\d\d)')
>>> phoneNumRegex.findall('我的电话是:010-1111-1111和010-8888-8888')
[('010', '1111', '111'), ('010', '8888', '888')]

1.如果在一个没有分组的正则表达式中使用,例如\d\d\d-\d\d\d\d-\d\d\d\dfindall()将返回一个其匹配的字符串的列表;
2.如果在一个有分组的正则表达式中使用,例如(\d\d\d)-(\d\d\d\d)-(\d\d\d\d)findall()将返回一个字符串的元组的列表(每个分组对应一个字符串)。
八、字符分类

\d:09的任何数字;\D:09的数字以外的任何字符;

\w:任何字母、数字或下划线字符(可以认为是匹配“单词”字符);\W:除字母、数字和下划线以外的任何字符;

\s:空格、制表符或换行符(可以认为是匹配“空白”字符);\S:除空格、制表符和换行符以外的任何字符。

这些分类有点笼统,根据具体的需求,你可以自己定义正则:

1.可以使用短横线表示字母或数字的范围:例如[a-zA-Z0-9]可以匹配所有小写字母、大写字母和数字。注意,在方括号内,普通的正则表达式符号不会被解释。

2.在[a-zA-Z0-9]的左上角插入字符(^),[^a-zA-Z0-9]就表示非判断,就是取除了这个要求之外的值。

九、插入字符和美元字符:

可以在正则表达式的开始处使用插入符号(^),表明匹配必须发生在被查找文本开始处。类似地,可以在正则表达式的末尾加上美元符号($),表示该字符串必须以这个正则表达式的模式结束。同时使用^$,表明整个字符串必须匹配该正则表达式。

>>> nums = re.compile(r'^\d+$')
>>> num = nums.search('a2017')
>>> num.group()
Traceback (most recent call last):
  File "<pyshell#77>", line 1, in <module>
    num.group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> nums = re.compile(r'^\d+$')
>>> num = nums.search('2017a')
>>> num.group()
Traceback (most recent call last):
  File "<pyshell#80>", line 1, in <module>
    num.group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> nums = re.compile(r'^\d+$')
>>> num = nums.search('2017')
>>> num.group()
'2017'
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值