Python学习4-7.4-7.11正则表达式查找文本


本文为学习python编程时所记录的笔记,仅供学习交流使用。

7.4 贪心和非贪心匹配

python正则表达式默认是贪心的,非贪心需要在花括号后边跟一个问号

>>> import re
>>> greedyHaRegex=re.compile(r'(Ha){3,5}')
>>> mo1=greedyHaRegex.search('HaHaHaHaHa')
>>> mo1.group()
'HaHaHaHaHa'
>>> nongreedyHaRegex=re.compile(r'(Ha){3,5}?')
>>> mo2=nongreedyHaRegex.search('HaHaHaHaHa')
>>> mo2.group()
'HaHaHa'

7.5 findall()方法

search的match对象只包含第一次出现的匹配文本

>>> phoneNumRegex=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo=phoneNumRegex.search('Cell:415-555-9999,work:215-555-0000')
>>> mo.group()
'415-555-9999'

findall返回一个字符串列表

>>> phoneNumRegex=re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') #has no groups
>>> phoneNumRegex.findall('Cell:415-555-9999,work:215-555-0000')
['415-555-9999', '215-555-0000']

如果正则表达式中有分组,则返回元组列表

>>> phoneNumRegex=re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') #has groups
>>> phoneNumRegex.findall('Cell:415-555-9999 work:212-555-0000')
[('415', '555', '9999'), ('212', '555', '0000')]

7.6 字符分类

缩写字符分类表示
\d0到9的任何数字
\D除0到9数字以外的任何字符
\w任何字母、数字或下划线字符(可以认为是匹配单词字符)
\W除字母、数字或下划线以外的任何字符
\s空格、制表符或换行符(可以认为是匹配空白的字符)
\S除空格、制表符或换行符以外的任何字符
>>> xmasRegex=re.compile(r'\d+\s\w+')
>>> xmasRegex.findall('12 drummers,11 pipers,10 lords,9 ladies,8 maids,7 swans,6 geese,5 rings,4 birds,3 hen,2 doves,1 partridge')
['12 drummers', '11 pipers', '10 lords', '9 ladies', '8 maids', '7 swans', '6 geese', '5 rings', '4 birds', '3 hen', '2 doves', '1 partridge']

7.7 建立自己的字符分类

可以用方括号定义自己的字符分类

>>> vowelRegex=re.compile(r'[aeiouAEIOU]')
>>> vowelRegex.findall('RObocop eats baby food. Baby FOOD.')
['O', 'o', 'o', 'e', 'a', 'a', 'o', 'o', 'a', 'O', 'O']

字符分类[a-zA-Z0-9]将匹配所有小写字母、大写字母和数字

>>> allAlphbtaRegex=re.compile(r'[a-zA-C]')
>>> allAlphbtaRegex.findall('What is your name? AHOW')
['h', 'a', 't', 'i', 's', 'y', 'o', 'u', 'r', 'n', 'a', 'm', 'e', 'A']

在字符分类的左方括号后加上一个插入字符^,就得到非此字符类

>>> consonantRegex=re.compile(r'[^aeiouAEIOU]')
>>> consonantRegex.findall('Roboco eats baby food.BABY FOOD.')
['R', 'b', 'c', ' ', 't', 's', ' ', 'b', 'b', 'y', ' ', 'f', 'd', '.', 'B', 'B', 'Y', ' ', 'F', 'D', '.']

7.8 插入字符和美元字符

字符^开头 是以此为开始

>>> beginsWithHello=re.compile(r'^Hello')`>>> atRegex=re.compile(r'.at')
>>> atRegex.findall('The cat in the hat sat on the flat mat.')
['cat', 'hat', 'sat', 'lat', 'mat']`
>>> beginsWithHello.search('Hello world!')
<re.Match object; span=(0, 5), match='Hello'>
>>> beginsWithHello.search('He said Hello.')==None
True

正则表达式r’\d$'匹配以数字0-9结束的字符串

>>> endsWithNumber=re.compile(r'\d$')
>>> endsWithNumber.search('Your number 007 is 42')
<re.Match object; span=(20, 21), match='2'>
>>> endsWithNumber.search('Your number 007 is forty two,')==None
True

正则表达式r’^\d+$'匹配从开始到结束都是数字的字符串

>>> wholeStringIsNum=re.compile(r'^\d+$')
>>> wholeStringIsNum.search('1234567890')
<re.Match object; span=(0, 10), match='1234567890'>
>>> wholeStringIsNum.search('123456xyz')==None
True
>>> wholeStringIsNum.search('123456 789')==None
True

7.9 通配字符

句点.字符成为通配符,匹配除换行外的所有字符 句点只能匹配一个字符

>>> atRegex=re.compile(r'.at')
>>> atRegex.findall('The cat in the hat sat on the flat mat.')
['cat', 'hat', 'sat', 'lat', 'mat']

7.9.1 用点-星匹配所有字符

>>> nameRegex=re.compile(r'First Name:(.*) Last Name:(.*)')
>>> mo=nameRegex.search('First Name:AL Last Name:Sweigart')
>>> mo.group(1)
'AL'
>>> mo.group(2)
'Sweigart'
>>> nongreedyRegex=re.compile(r'<.*?>')
>>> mo=nongreedyRegex.search('<To server a man>for dinner.')
>>> mo.group()
'<To server a man>'
>>> greedyRegex=re.compile(r'<.*>')
>>> mo=greedyRegex.search('<To server a man>for dinner.>')
>>> mo.group()
'<To server a man>for dinner.>'

7.9.2 用句点字符匹配换行

通过传入re.DOTALL作为re.compile的第二个参数,可以让句点匹配所有字符,包括换行

>>> noNewlineRegex=re.compile('.*')
>>> noNewlineRegex.search('server the public trust.\nprotect the innocent.\n uphold the law.').group()
'server the public trust.'
>>> newlineRegex=re.compile('.*',re.DOTALL)
>>> newlineRegex.search('server the public trust.\nprotect the innocent.\n uphold the law')
<re.Match object; span=(0, 62), match='server the public trust.\nprotect the innocent.\n>

7.11 不区分大小写的匹配

可向re.compile传入re.IGNORECASE或re.I,作为第二个参数

>>> robocop=re.compile(r'robocop',re.I)
>>> robocop.search('RoBocop is part man,part machine,all cop.').group()
'RoBocop'

内容来源

[1] [美]斯维加特(Al Sweigart).Python编程快速上手——让繁琐工作自动化[M]. 王海鹏译.北京:人民邮电出版社,2016.7.p123-129

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值