第三章 Re库

3.1 正则表达式的基本语法

. 表示任何单个字符
[ ] 字符集,对单个字符给定取值范围。 [abc] 表示取值 a,b,c, [a-z]表示a到z单个字符
[^ ] 非字符集, 单个字符排除取值范围。[^abc] 表示非a或非b或非c的单个字符

  • 前一个字符 0次 或者 无限次 扩展。 abc* 表示 ab,abc, abcc,abccc等
  • 前一个字符 1次 或者 无限次 扩展。 abc+ 表示 abc,abcc, abccc等
    ? 前一个字符 0 次 或者 1次 扩展。 abc?表示 ab, abc
    | 左右表示式任意一个。 abc|def 表示abc、def
    {m} 扩展一个字符 m 次。 ab{2}c 表示 abbc
    {m,n} 扩展前一个字符 m 至 n 次。 ab{1,2}c 表示 abc,abbc
    ^ 匹配字符串开头。^ abc 表示abc且在一个字符串的开头
    $ 匹配字符串结尾。 abc$ 表示 abc且在一个字符串的结尾
    ( ) 分组标记,里面和 | 连用。 (abc)表示abc,(abc|def)表示abc,def
    \d 数字,等价 [ 0-9]
    \w 单词字符,等价 [ A-Za-z0-9]
P(Y|YT|YTH|YTHO)?N 
# PN, PYN, PYTN, PYTHN, PYTHON

PYTHON+ 
# PYTHON, PYTHONN, PYTHONNN..

PYT[TH]ON
# PYTTON, PYTHON

PY[^TH])ON 
# PYON, PYaON, PYbON

经典正则表达式

^[A-Za-z]+$ 
#由26个字母组成的字符串
^-?\d+$
# 整数表达,可能含有负号
^[0-9]*[1-9][0-9]*$
#正整数的表达

#IP地址表达
0-99: [1-9]?\d
100-199: 1\d{2}
200-249: 2[0-4]\d
250-255:25[0-5]
t =[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]
((t).){3}(t)

3.2 Re库的基本使用

import re
raw string 类型表示,不包含转义符。r‘text’

re.search(): 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match(): 在一个字符串的开始位置匹配正则表达式,返回match对象
re.findall(): 搜索字符串,以列表类型返回全部能匹配的子串
re.split():将一个字符串按照正则表达式匹配进行风格,返回列表类型
re.finditer(): 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素都是match对象
re.sub():在一个字符串中代替所有匹配正则表达式的子串,返回替代后的字符串

3.3 re.search( ) , re.match (), re.findall(), re.split(), re.finditer()

re.search(pattern, string, flags =0)
在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象

import re
search = re.search(r'[1-9]\d{5}, 'BIT 100081')
if search:
  print (search.group(0))

re.match(pattern, string, flags =0)
在一个字符串的开始位置匹配正则表达式,返回match对象

match = re.match(r'[1-9]\d{5}, 'BIT 100081')
# Traceback Errors
match = re.match(r'[1-9]\d{5}, '100081 BIT')
# '10081'

re.findall(pattern, string, flag =0)
搜索字符串, 以列表的形式返回全部匹配的字符串

ls = re.findall(r'[1-9]\d{5}, 'BIT 100081 TSU10084')
# ['100081', '100084']

re.split(pattern, string, maxsplit =0, flags =0)
将一个字符串按照正则表达式匹配进行风格,返回列表类型
maxsplit() 最大分割数,剩余部分作为最后一个元素输出

re.split(r'[1-9]\d{5}, 'BIT 100081 TSU10084')
#['BIT', 'TSU', ' ']

re.finditer(pattern, string, flags =0)
搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素都是match对象

for m in re.finditer(r'[1-9]\d{5}, 'BIT 100081 TSU10084')
  if m:
      print m
# 100081
# 100084

re.sub(pattern, repl, string, count =0, flags =0)
在一个字符串中代替所有匹配正则表达式的子串,返回替代后的字符串

re.sub(r'[1-9]\d{5}, ':zipcode', 'BIT 100081 TSU10084')
'BIT:zipcode TSUf:zipcode'

3.4 Re库的等价用法

rst = re.search(r'[1-9]\d{5}', 'BIT 100081')
==
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT 100081')

3.5 re中的match对象

.string 待匹配的文本
.re 匹配时使用的pattern对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置

m= re.match(r'[1-9]\d{5}, 'BIT 100081')
m.string
# 'BIT 100081'
m.re
# re.compile('[1-9]\\d{5}')
m.pos
# 0
m.endpos
# 19
m.group(0)
#'10081'

3.6 Re库的贪婪匹配

Re库默认采用贪婪匹配,即输出匹配最长的字串

最小匹配操作符
*? 前一个字符 0次或者无限次 扩展, 最小匹配
+? 前一个字符1次或者无限次 扩展, 最小匹配
?? 前一个字符0次或者1次 扩展,最小匹配
{m,n}? 扩展一个字符m至n次(含n次),最小匹配

match = re.search(r'PY.*N', 'PYANBNCNDN')
match.group(0)
# 'PYANBNCNDN'

match = re.search(r'PY.*?N', 'PYANBNCNDN')
match.group(0)
# 'PYAN' '(最小匹配)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 7,031评论 0 99
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 3,967评论 0 13
  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 22,812评论 4 46
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 2017.7.8经过一晚修整,出发久违的香港,中转去印度。 国泰航空,准时率51%,终于领教到,如期登机,但是活生...
    张瑞秋5114阅读 107评论 0 0