当前位置: 首页 > article >正文

139.《python中的正则详解》

文章目录

      • 什么是正则
      • 正则表达式语法
      • 正则demo
          • 1.匹配模式
          • 2.finditer
          • 3.正则分组
          • 4.非捕获组
          • 5.分组的引用
          • 6. 正则替换
          • 7.正则切割
          • 7.正则「或」
          • 7.枚举取反
      • 面试题

前言: 拉开差距的不是上班的8小时,而是下班后的16小时,同志们,加油,卷起!!!

什么是正则

1.正则表达式是一种高级文本处理技术,通过特征匹配、特征搜索和特征替换功能完成对复杂字符串的校验、字符串搜索、和替换操作。
2.正则表达式是一些由字符和特殊符号组成的字符串,这些字符和特殊符号有特殊意义,用来描述一个字符串的组成方式.

正则表达式语法

表达式描述
\d数字
\D非数字
\w字母数字下划线
\s所有空白符,包括换行符
\S非空白符,不包括换行符
.任意字符, 不包括换行符
[]枚举, 匹配括号里出现的字符
[^]枚举取反, 匹配中括号里出现的字符之外的字符
*子表达式零次或多次
+子表达式一次或多次
?子表达式零次或一次,或指明一个非贪婪限定符
\转义符
^匹配字符串的开头
$匹配字符串的结尾
{n,m}匹配前面的子表达式至少n次,至多m次
|
()分组
(?😃非捕获组
exp1(?=exp2)匹配exp2 前面的 exp1
(?<=exp2)exp1匹配 exp2 前面的 exp1
exp1(?!exp2)匹配后面不是 exp2 的 exp1
(?<!exp2)exp1匹配前面不是 exp2 的 exp1

正则demo

1.匹配模式
import re
text = '正则表达式是一种高级文本处理\n技术,通过特征匹配、特征搜索和特征替换功能完成对复杂字符串的\n校验、字符串搜索、和替换操作'
"""
	I: 忽略大小写.
	M: 拆分行, 多行匹配. 这个是影响^$.
	S: 忽略换行符. 也可以理解为使"."匹配所有字符.
	X: 添加注释, 使正则表达式便于理解.
	DOTALL: 等价于S.
	U: python3不用了.
"""
result = re.findall(r'.* # 这是我的test注释', text, re.M | re.X)
print(result) 
# ['正则表达式是一种高级文本处理', '', '技术,通过特征匹配、特征搜索和特征替换功能完成对复杂字符串的', '', '校验、字符串搜索、和替换操作', '']
2.finditer

测试文本

text = '鲁镇的酒店的格局,是和别处不同的:都是当街一个曲尺形的大柜台,柜里面预备着热水,可以随时温酒。做工的人,傍午傍晚散了工,每每花四文铜钱,买一碗酒,——这是二十多年前的事,现在每碗要涨到十文,——靠柜外站着,热热的喝了休息;倘肯多花一文,便可以买一碟盐煮笋,或者茴香豆,做下酒物了,如果出到十几文,那就能买一样荤菜,但这些顾客,多是短衣帮⑴,大抵没有这样阔绰⑵。只有穿长衫的,才踱进店面隔壁的房子里,要酒要菜,慢慢地坐喝。
我从十二岁起,便在镇口的咸亨酒店里当伙计,掌柜说,样子太傻,怕侍候不了长衫主顾,就在外面做点事罢。外面的短衣主顾,虽然容易说话,但唠唠叨叨缠夹不清的也很不少。他们往往要亲眼看着黄酒从坛子里舀出,看过壶子底里有水没有,又亲看将壶子放在热水里,然后放心:在这严重监督下,羼⑶水也很为难。所以过了几天,掌柜又说我干不了这事。幸亏荐头⑷的情面大,辞退不得,便改为专管温酒的一种无聊职务了。
我从此便整天的站在柜台里,专管我的职务。虽然没有什么失职,但总觉得有些单调,有些无聊。掌柜是一副凶脸孔,主顾也没有好声气⑸,教人活泼不得;只有孔乙己到店,才可以笑几声,所以至今还记得。
孔乙己是站着喝酒而穿长衫的唯一的人。他身材很高大;青白脸色,皱纹间时常夹些伤痕;一部乱蓬蓬的花白的胡子。穿的虽然是长衫,可是又脏又破,似乎十多年没有补,也没有洗。他对人说话,总是满口之乎者也⑹,教人半懂不懂的。因为他姓孔,别人便从描红纸上的“上大人孔乙己⑺”这半懂不懂的话里,替他取下一个绰号,叫作孔乙己。孔乙己一到店,所有喝酒的人便都看着他笑,有的叫道,“孔乙己,你脸上又添上新伤疤了!”他不回答,对柜里说,“温两碗酒,要一碟茴香豆。”便排出九文大钱。他们又故意的高声嚷道,“你一定又偷了人家的东西了!”孔乙己睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你偷了何家的书,吊着打。”孔乙己便涨红了脸,额上的青筋条条绽出,争辩道,“窃书不能算偷……窃书!……读书人的事,能算偷么?”接连便是难懂的话,什么“君子固穷⑻”,什么“者乎”之类,引得众人都哄笑起来:店内外充满了快活的空气。
听人家背地里谈论,孔乙己原来也读过书,但终于没有进学⑼,又不会营生⑽;于是愈过愈穷,弄到将要讨饭了。幸而写得一笔好字,便替人家钞⑾钞书,换一碗饭吃。可惜他又有一样坏脾气,便是好喝懒做。坐不到几天,便连人和书籍纸张笔砚,一齐失踪。如是几次,叫他抄书的人也没有了。孔乙己没有法,便免不了偶然做些偷窃的事。但他在我们店里,品行却比别人都好,就是从不拖欠;虽然间或没有现钱,暂时记在粉板上,但不出一月,定然还清,从粉板上拭去了孔乙己的名字。
孔乙己喝过半碗酒,涨红的脸色渐渐复了原,旁人便又问道,“孔乙己,你当真认识字么?”孔乙己看着问他的人,显出不屑置辩的神气。他们便接着说道,“你怎的连半个秀才也捞不到呢?”孔乙己立刻显出颓唐不安模样,脸上笼上了一层灰色,嘴里说些话;这回可是全是之乎者也之类,一些不懂了。在这时候,众人也都哄笑起来:店内外充满了快活的空气。
在这些时候,我可以附和着笑,掌柜是决不责备的。而且掌柜见了孔乙己,也每每这样问他,引人发笑。孔乙己自己知道不能和他们谈天,便只好向孩子说话。有一回对我说道,“你读过书么?”我略略点一点头。他说,“读过书,……我便考你一考。茴香豆的茴字,怎样写的?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会。孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些字应该记着。将来做掌柜的时候,写账要用。”我暗想我和掌柜的等级还很远呢,而且我们掌柜也从不将茴香豆上账;又好笑,又不耐烦,懒懒的答他道,“谁要你教,不是草头底下一个来回的回字么?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说,“对呀对呀!……回字有四样写法⑿,你知道么?”我愈不耐烦了,努着嘴走远。孔乙己刚用指甲蘸了酒,想在柜上写字,见我毫不热心,便又叹一口气,显出极惋惜的样子。
有几回,邻居孩子听得笑声,也赶热闹,围住了孔乙己。他便给他们茴香豆吃,一人一颗。孩子吃完豆,仍然不散,眼睛都望着碟子。孔乙己着了慌,伸开五指将碟子罩住,弯腰下去说道,“不多了,我已经不多了。”直起身又看一看豆,自己摇头说,“不多不多!多乎哉?不多也⒀。”于是这一群孩子都在笑声里走散了。
孔乙己是这样的使人快活,可是没有他,别人也便这么过。
有一天,大约是中秋前的两三天,掌柜正在慢慢的结账,取下粉板,忽然说,“孔乙己长久没有来了。还欠十九个钱呢!”我才也觉得他的确长久没有来了。一个喝酒的人说道,“他怎么会来?……他打折了腿了。”掌柜说,“哦!”“他总仍旧是偷。这一回,是自己发昏,竟偷到丁举人家里去了。他家的东西,偷得的么?”“后来怎么样?”“怎么样?先写服辩⒁,后来是打,打了大半夜,再打折了腿。”“后来呢?”“后来打折了腿了。”“打折了怎样呢?”“怎样?……谁晓得?许是死了。”掌柜也不再问,仍然慢慢的算他的账。
中秋之后,秋风是一天凉比一天,看看将近初冬;我整天的靠着火,也须穿上棉袄了。一天的下半天,没有一个顾客,我正合了眼坐着。忽然间听得一个声音,“温一碗酒。”这声音虽然极低,却很耳熟。看时又全没有人。站起来向外一望,那孔乙己便在柜台下对了门槛坐着。他脸上黑而且瘦,已经不成样子;穿一件破夹袄,盘着两腿,下面垫一个蒲包,用草绳在肩上挂住;见了我,又说道,“温一碗酒。”掌柜也伸出头去,一面说,“孔乙己么?你还欠十九个钱呢!”孔乙己很颓唐的仰面答道,“这……下回还清罢。这一回是现钱,酒要好。”掌柜仍然同平常一样,笑着对他说,“孔乙己,你又偷了东西了!”但他这回却不十分分辩,单说了一句“不要取笑!”“取笑?要是不偷,怎么会打断腿?”孔乙己低声说道,“跌断,跌,跌……”他的眼色,很像恳求掌柜,不要再提。此时已经聚集了几个人,便和掌柜都笑了。我温了酒,端出去,放在门槛上。他从破衣袋里摸出四文大钱,放在我手里,见他满手是泥,原来他便用这手走来的。不一会,他喝完酒,便又在旁人的说笑声中,坐着用这手慢慢走去了。
自此以后,又长久没有看见孔乙己。到了年关⒂,掌柜取下粉板说,“孔乙己还欠十九个钱呢!”到第二年的端午,又说“孔乙己还欠十九个钱呢!”到中秋可是没有说,再到年关也没有看见他。
我到现在终于没有见——大约孔乙己的确死了。 [2]
一九一九年三月。'
# 需求: 找出 所有的 ‘孔乙己’
result = re.finditer(r'孔乙己', text, re.M)
for item in result:
	print(item.group())

在这里插入图片描述

3.正则分组
 需求:
text_list = ['2022-06-12', '2021 07 08', '2019/05/06']
# 匹配年月日, **单独**把年,月,日拿出来.
for text in text_list:
   result2 = re.findall(r'(\d{4})[-\s/]+(\d{2})[-\s/]+(\d{2})', text)
   print(result2[0])
   print(result2[1])
   print(result2[2])
 

在这里插入图片描述

4.非捕获组
# 需求:之遥域名,不要协议
text1_list = [
    'https://www.baidu.com/',
    'http://www.baidu.com/'
]
for text1 in text1_list:
    result = re.findall(r'(?:http://|https://)(www.*)$', text1)
    print(result[0][:-1])

在这里插入图片描述

5.分组的引用
text2_list = [
    '<div>王老板</div>',
    '<div>王老板</img>'
]
for text2 in text2_list:
	result = re.search(r'<(\w+)>[\u4e00-\u9fa5]+</\1>', text2)
	print(result)

在这里插入图片描述

6. 正则替换
# 需求: 我不管这个人是谁 ,我都要他是永远的神.
text3_list = [
    '王老板永远的神',
    '张老板永远的无敌',
    '李老板永远的爹',
    '邱老板永远的神父1212121'
]
for text3 in text3_list:
	result = re.sub(r'(.老板永远的)(.*)', r'\1神',text3)
	print(result)

在这里插入图片描述

7.正则切割
str = '猿人学, 王老板; 卞大. 周杰伦'
result = re.split(r'[,;.]', str)
print(result)

在这里插入图片描述

7.正则「或」
text_list09 = [
    'wlb.avi',
    'wlb.mp4',
    'wlb.jpg',
    'wlb.zip',
    'wlb.txt',
    'wlb.xls',
    # 'wlb.mpt',
]
for item in text_list09:
	result = re.findall(r'wlb.(avi|mp4|jpg|zip|txt|xlsx?)$', item)
	print(result)

在这里插入图片描述

7.枚举取反
# 需求: 取出所有英文
str = '正则表达式是一种高级文本处理技术(Regular expression is an advanced text processing technology)'
result = re.search(r'[^\u4e00-\u9fa5]+', str)

在这里插入图片描述

面试题

import re
# 题1: 匹配出叠字的亲戚, 如爷爷, 奶奶可通过, 姑妈不可通过.
text4_list = [
    'yeye',
    'nainai',
    'jiujiu',
    'guma',
    'yima',
    'baba',
]
regex = re.compile(r'([^\W\d_]+)\1')
for text4 in text4_list:
    regex = regex.search(r'请写入正则表达式', text4)
    if regex:
        print("匹配成功:", regex.group())
    else:
        print("匹配失败:", text4)

# 见图片. 面试题.jpg
test_string = "<a>测试</a><sub>测试测试</sub><sup>测试测试测试</sup><div>测试测</div><img>testtesttest</img>"


写一个方法清除字符串中除了. .</sub>以外所有 html标签

test_string = "<a>测试</a><sub>测试测试</sub><sup>测试测试测试</sup><div>测试测</div><img>testtesttest</img>"


http://www.kler.cn/a/457526.html

相关文章:

  • node.js内置模块之---http 和 https 模块
  • 重庆大学软件工程复试怎么准备?
  • react axios 优化示例
  • C++基础概念复习
  • USB子系统学习(一)USB电气信号
  • 【双层模型】考虑供需双侧的综合能源双层优化模型
  • 解决编译Wireshark4.4.2源码失败的问题
  • Java8-Function的使用之读取文件
  • 【Linux基础】进程(上) —— 概念、状态、优先级与环境变量
  • 前端Python应用指南(六)构建RESTful API:使用Flask和Django实现用户认证与授权
  • 使用Quick 录屏为视频生成二维码
  • 企业人工智能平台 (AIaaP) 的全面解读
  • orm01
  • 深度学习:基于MindSpore NLP的数据并行训练
  • 玩转树莓派Pico(20): 迷你气象站6——软件整合改进
  • Unity3D仿星露谷物语开发9之创建农场Scene
  • Facebook广告优化新知:如何使用即时体验
  • C# dynamic 类型详解
  • 鸿蒙next RCP网络请求工具类进阶版来了
  • 【机器学习】Transformer
  • 代码随想录算法训练营第六十天 | 图 | A星算法
  • Bash语言的并发编程
  • 算法排序算法
  • 【每日学点鸿蒙知识】worker线程数量、判断用户是否进行权限决定、图片上传类型错误、request锁释放时机、H5问题
  • Zynq PS端外设之中断控制器
  • FFmpeg来从HTTP拉取流并实时推流到RTMP服务器