第三章 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' '(最小匹配)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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

友情链接更多精彩内容