正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

eg:IP地址的正则表达式

        (\d{1,3}\.){3}\d{1,3}

1 正则表达式模式 

^     匹配字符串的开头

$     匹配字符串的末尾。

.     匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'

[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

re*  匹配0个或多个的表达式。

re+  匹配1个或多个的表达式。

re?  匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式

re{n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。

re{n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。

re{n,m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式

a| b  匹配a或b

(re)  匹配括号内的表达式,也表示一个组

\w    匹配字母数字及下划线

\W    匹配非字母数字及下划线

\s     匹配任意空白字符,等价于 [\t\n\r\f].

\S    匹配任意非空字符

\d     匹配任意数字,等价于 [0-9].

\D    匹配任意非数字

\A    匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。

\z    匹配字符串结束

\G    匹配最后匹配完成的位置。

\b    匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

\B    匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

\n, \t, 等. 匹配一个换行符。匹配一个制表符。等

\1...\9 匹配第n个分组的内容。

\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

.*   贪婪模式

     匹配除换行符之外的所有字符

     eg:a.*b 匹配以a开始,以b结束的最长字符串

         如 aabab,则匹配到全部

.*   懒惰模式

     eg:a.*b 匹配以a开始,以b结束的最短字符串

         如 aabab,则匹配到aab  ab

修饰符(flags)

re.I 使匹配对大小写不敏感

re.L 做本地化识别(locale-aware)匹配

re.M 多行匹配,影响 ^ 和 $

re.S 使 . 匹配包括换行在内的所有字符

re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.

re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解


2 正则表达式函数

re.match函数  

#尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

语法: re.match(pattern, string, flags=0)

eg

  import re

  print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配    span()返回匹配开始和结束位置

  print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配 

输出:

  (0, 3)

  None


re.search函数

扫描整个字符串并返回第一个成功的匹配。  

语法: re.search(pattern, string, flags=0)

eg:

import re

print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配

print(re.search('com', 'www.runoob.com').span())  # 不在起始位置匹配

输出结果为:

(0, 3)

(11, 14)


区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;

re.search匹配整个字符串,直到找到一个匹配。

相同:输出结果都是一个


re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,

语法为: re.compile(pattern, flags)

         #pattern : 一个字符串形式的正则表达式

         #flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参考修饰符


findall 函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法为:findall(string, pos, endpos)

       #pos : 可选参数,指定字符串的起始位置,默认为 0。

       #endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

eg:

import re

pattern = re.compile(r'\d+')   # 查找数字

result1 = pattern.findall('runoob 123 google 456')

result2 = pattern.findall('run88oob123google456', 0, 10)

print(result1)

print(result2)

输出结果:

['123', '456']

['88', '12']


re.split 函数

split 方法按照能够匹配的子串将字符串分割后返回列表

语法为:re.split(pattern, string, maxsplit=0, flags=0)

       #pattern 匹配的正则表达式

       #string 要匹配的字符串。

       #maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。

       #flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 

>>>import re

>>> re.split('\W+', 'runoob, runoob, runoob.')

['runoob', 'runoob', 'runoob', '']

>>> re.split('(\W+)', ' runoob, runoob, runoob.') 

['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']

>>> re.split('\W+', ' runoob, runoob, runoob.', 1) 

['', 'runoob, runoob, runoob.']

>>> re.split('a*', 'hello world')   # 对于一个找不到匹配的字符串而言,split 不会对其作出分割

['hello world']


re.sub函数

用于替换字符串中的匹配项。

语法:re.sub(pattern, repl, string, count=0, flags=0)

     #pattern : 正则中的模式字符串。

     #repl : 替换的字符串,也可为一个函数。

     #string : 要被查找替换的原始字符串。

     #count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

eg:

import re

phone = "2004-959-559 # 这是一个国外电话号码"

# 删除字符串中的 Python注释 

num = re.sub(r'#.*$', "", phone)   # #.*$ 贪婪模式 匹配以#开始,到结束最长字符

print "电话号码是: ", num

# 删除非数字(-)的字符串 

num = re.sub(r'\D', "", phone)

print "电话号码是 : ", num

执行结果如下:

电话号码是:  2004-959-559 

电话号码是 :  2004959559


3 分组 group()

使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

eg:

import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:      #判断能否匹配到正则表达式

   print "matchObj.group() : ", matchObj.group()

   print "matchObj.group(1) : ", matchObj.group(1)

   print "matchObj.group(2) : ", matchObj.group(2)

else:

   print "No match!!"

执行结果如下:

matchObj.group() :  Cats are smarter than dogs

matchObj.group(1) :  Cats

matchObj.group(2) :  smarter

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值