网易首页 > 网易号 > 正文 申请入驻

关于正则表达式,所知道的都在这里

0
分享至

  • 一、写在前面

  • 二、语法

    • 1. 匹配单个字符

    • 2. 匹配一组字符

    • 3. 使用元字符

    • 4. 重复匹配

    • 5. 位置匹配

    • 6. 子表达式

    • 7. 回溯引用(前后一致匹配)

    • 8. 前后查找

  • 三、在 Python 中使用

    • 1. re 库

    • 2. pandas 库

一、写在前面
  • 在学习和使用正则表达式的时候,重要的并不是知道多少个特殊字符,而是会不会运用它们去解决实际问题

  • 「基本用途:搜索和替换」

  • 正则表达式是一些用来匹配和处理文本的字符串

  • 语法是正则表达式最容易掌握的部分,真正的挑战是学会如何运用语法把实际问题分解为一系列正则表达式并最终解决

  • 在编写正则表达式的时候,同一个问题往往会有多种解决方案

  • 验证某个模式能不能获得预期的匹配结果并不困难,但如何验证它不会匹配到不想到的东西可就没那么简单了

  • 「正则表达式在线测试网页」

❝ 「https://c.runoob.com/front-end/854/」 ❞
网站界面 二、语法 1. 匹配单个字符

  • 正则表达式是区分字母大小写的



  • 如果要忽略值的大小写,需要使用re.I



  • .可以匹配任何一个字符、字母、数字、甚至是 . 本身



  • 在同一个正则表达式里允许使用多个 . 字符,既可以连续出现,也可以间隔出现在模式的不同位置



  • 使用\对特殊字符(元字符)进行转义,\本身也是一个元字符


2. 匹配一组字符
  • 使用[]定义字符集合

  • 在定义一个字符区间的时候,一定要避免让这个区间的尾字符小于它的首字符(根据 ASCII 字符的大小)

  • 在字符集合以外的地方,-只是一个普通字符,只能与-本身相匹配,-字符不需要做转义

  • ^对一个字符集合进行取非匹配

  • ^作用于给定字符集合里的所有字符和字符区间,而不是仅限于紧跟在^后面的那一个字符或字符区间

3. 使用元字符
元字符 说明 [\b] 回退(删除)一个字符 \f 换页符「\n」「换行符」「\r」「回车符」「\t」「制表符」\v 垂直制表符「\d」「任何一个数字字符,等价于[0-9]」「\D」「任何一个非数字字符」「\w」「等价于[a-zA-Z0-9_]」「\W」「任何一个非字母数字或非下划线字符」「\s」「等价于[\f\n\r\t\v]」「\S」「任何一个非空白字符」\E 结束 \L 或 \U 转换 \l 把下一个字符转换为小写 \L 把 \L 到 \E 之间的字符全部转换为小写 \u 把下一个字符转换为大写 \U 把 \U 到 \E 之间的字符全部转换为大写「正向前查找」「负向前查找」「正向后查找」「负向后查找」(?m) 分行模式匹配
  • \r\n是 Windows 所使用的文本行结束标签

  • 在 Linux 上匹配空白行只使用\n\n即可

  • 同时适用于 Windows 和 Linux 的正则表达式应该包含一个可选的\r和一个必须被匹配的\n

  • 十六进制(逢16进1)数值要用前缀\x来给出

  • 八进制(逢8进1)数值要用前缀\0来给出

  • |表示逻辑操作符

4. 重复匹配
  • +匹配一个或多个字符(或字符集合)

  • *匹配零个或多个字符(或字符集合)

  • ?匹配零个或一个字符(或字符集合)

  • 如果打算同时使用[]?,千万记得应该把?放在字符集合的外面

  • 重复次数要用{}来给出,把数值写在里面,重复的次数可以是0

  • {m,n}为匹配次数设定一个最小值和最大值

  • {m,}为匹配次数设定一个最小值

  • {,n}为匹配次数设定一个最大值

  • 懒惰型元字符的写法,只要给贪婪型元字符加上一个?后缀即可

5. 位置匹配
  • 位置匹配解决在什么地方进行字符串匹配操作的问题

  • 由限定符\b指定单词的边界,用来匹配一个单词的开头和结尾

  • \b匹配且只匹配一个位置,不匹配任何字符

  • 想表明不匹配一个单词边界,使用\B

  • ^定义字符串开头,$定义字符串结尾

  • ^\s*匹配一个字符串的开头位置和随后的零个或多个空白字符

  • \s*$匹配一个字符串的结尾位置零个或多个空白字符

  • 如果要使用分行匹配模式,需要使用re.S

6. 子表达式
  • 使用()来把子表达式当作一个独立元素

  • 子表达式允许多重嵌套,但在实际工作中遵循一个适可而止的原则

  • 绝大多数嵌套子表达式都没有看上去那么复杂

  • 把必须匹配的情况考虑周全并写出一个匹配结果符合预期的正则表达式很容易,但把不需要匹配的情况也考虑周全并确保它们都将被排除在匹配结果之外往往要困难得多

7. 回溯引用(前后一致匹配)
  • 回溯引用允许正则表达式模式引用前面的匹配结果

  • 回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式

  • 可以把回溯引用想象成变量

  • Java 和 Python 将返回一个包含group的数组匹配对象

  • 回溯引用只能用来引用模式里的子表达式

  • 回溯引用匹配通常从1开始计数(\1

  • 如果子表达式的相对位置发生了变化,整个模式也许就不能再完成原来的工作

  • 「查找时,使用\n;替换时,使用$n

  • 在对文本进行重新排版时,把文本分解成多个子表达式的做法往往非常有用,可以对文本的排版效果做出更精准的控制

  • 需要用到re.finditer(pattern,string,flags)

list_temp = []
for item in re.finditer(r'(?<=).*?(?=)','一级标题二级标题这里是错误'):
list_temp.append(item.group())

list_temp

# ['一级标题', '二级标题']
8. 前后查找


  • 在同一个搜索模式里可以使用多个前后查找表达式



  • 向前查找指定了一个必须匹配但不在结果中返回的模式,实际就是一个以?=开头的子表达式



  • 向后查找指定了一个必须匹配但不在结果中返回的模式,实际就是一个以?<=结尾的子表达式



  • 向前查找模式的长度是可变的,可以包含\+之类的元字符;向后查找模式只能是固定长度



  • 前后查找必须用!替换掉=来取非


三、在 Python 中使用 1. re 库 (1)re.findall(pattern,string,flags)
  • 返回的结果是列表,如果没有匹配到结果,返回空列表

import re

result = re.findall('工号是(.*?),','我的名字是张三,工号是110110,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生')

# ['110110', '120120']
(2)re.search(pattern,string,flags)

  • 要得到匹配结果,需要通过group()方法获取值,如果没有匹配到结果,返回None

  • 只有在group()的参数为 1 时,才会返回子表达式中的结果

  • group()的参数最大不能超过正则表达式里子表达式的个数

import re

result = re.search('工号是(.*?),','我的名字是张三,工号是110110,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生').group(1)

# '110110'
(3)re.sub(pattern,replace,string,count) / re.subn(pattern,replace,string,count)

  • 可以指定替换次数,不指定则默认替换全部

import re

result1 = re.sub('\d+','119119','我的名字是张三,工号是110110,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生')

result2 = re.subn('\d+','119119','我的名字是张三,工号是110110,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生',1)

print(result1)
print(result2[0])

# 我的名字是张三,工号是119119,职业是法外狂徒;他的名字是李四,工号是119119,职业是医生
# 我的名字是张三,工号是119119,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生
(4) re.finditer(pattern,string,flags)import re

for item in re.finditer('\d+','我的名字是张三,工号是110110,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生'):
print(item.group())

# 110110
# 120120
(5)re.split(pattern,string,maxsplit)

  • 返回字符串被分割后的列表,可以指定最大分割次数,不指定则全部分割

import re

result1 = re.split('\d+','我的名字是张三,工号是110110,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生')

result2 = re.split('\d+','我的名字是张三,工号是110110,职业是法外狂徒;他的名字是李四,工号是120120,职业是医生',maxsplit=1)

print(result1)
print(result2)

# ['我的名字是张三,工号是', ',职业是法外狂徒;他的名字是李四,工号是', ',职业是医生']
# ['我的名字是张三,工号是', ',职业是法外狂徒;他的名字是李四,工号是120120,职业是医生']
2. pandas 库

  • 构造数据

import pandas as pd

df = pd.DataFrame(data=['纤美(CICI)','江中猴姑','PENTAL SOFTLY','25°', '卡士(CLASSY·KISS)'],
columns=['品牌全名'])
df

  • 自定义函数

def chinese_name(x):
result = re.findall('[一-龟]',x)
return ''.join(result)

df['中文品牌名_自定义函数'] = df['品牌全名'].apply(chinese_name)
df

  • Series.str.findall(pattern, flags)

df['中文品牌名_findall'] = df['品牌全名'].str.findall('[一-龟]').apply(lambda x:''.join(x))
df
  • Series.str.contains(pattern,regex=True,flags)

df['英文品牌名_contains'] = df['品牌全名'].str.contains('[a-zA-Z]',regex=True)
df
  • Series.str.replace(pattern,replace)

df['英文品牌名_match'] = df['品牌全名'].str.match('[a-zA-Z]')
df
  • Series.str.extract(pattern, flags,expand) / Series.str.extractall(pattern, flags)

df['品牌名_replace'] = df['品牌全名'].str.replace('[0-9]','XX')
df
  • Series.str.match(pattern, flags).str[0]

df['品牌名_extract'] = df['品牌全名'].str.extract(r'([a-zA-Z].*)',expand=True)
df['品牌名_extract'] = df['品牌名_extract'].str.replace('\)','')
df

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
菲律宾爆发粮食危机,美趁火打劫,没了中国援助,马科斯只剩画饼

菲律宾爆发粮食危机,美趁火打劫,没了中国援助,马科斯只剩画饼

白浅娱乐聊
2024-06-13 07:51:24
电动车被禁止后,又出现了新型的接娃方式,家长:路堵,心更堵

电动车被禁止后,又出现了新型的接娃方式,家长:路堵,心更堵

大何向东流
2024-06-12 22:38:39
不是,到底是谁在花几十块买一张苹果手机截图啊?

不是,到底是谁在花几十块买一张苹果手机截图啊?

差评
2024-06-12 11:29:52
​广东“美女贪官”:大搞权色交易,丈夫却鼓励她,并为其打掩护

​广东“美女贪官”:大搞权色交易,丈夫却鼓励她,并为其打掩护

天闻地知
2024-06-13 09:45:27
裸体保洁,到底是个什么职业?

裸体保洁,到底是个什么职业?

环行星球
2024-06-12 20:31:58
一场3-0,让中国女排近乎出线!奥运名额尘埃落定,感谢美国助攻

一场3-0,让中国女排近乎出线!奥运名额尘埃落定,感谢美国助攻

侃球熊弟
2024-06-13 12:26:07
将近40岁满脸褶,却尬演18岁少女,是谁给了她“强行装嫩”的勇气

将近40岁满脸褶,却尬演18岁少女,是谁给了她“强行装嫩”的勇气

娱乐圈十三太保
2024-05-28 13:56:53
女子没工作一周买3次榴莲,丈夫心灰意冷让她上班,两人对话窒息

女子没工作一周买3次榴莲,丈夫心灰意冷让她上班,两人对话窒息

雅清故事汇
2024-06-12 13:06:54
CCTV5直播!中国女排PK德国,朱婷首发大调整,蔡斌3比0就进奥运

CCTV5直播!中国女排PK德国,朱婷首发大调整,蔡斌3比0就进奥运

元爸体育
2024-06-13 13:28:35
柳州18路公交车发生意外事故,一老人救治无效身亡

柳州18路公交车发生意外事故,一老人救治无效身亡

环球网资讯
2024-06-13 13:42:28
女生胸太大运动起来有多辛苦?妹子纷纷晒图…真的被她们装到了

女生胸太大运动起来有多辛苦?妹子纷纷晒图…真的被她们装到了

经典段子
2024-06-11 23:37:28
黄一鸣真是一鸣惊人了,母凭子贵,小王的降临,老王家有后很高兴

黄一鸣真是一鸣惊人了,母凭子贵,小王的降临,老王家有后很高兴

校长侃财
2024-06-13 12:17:03
林更新考博成功,赵丽颖疑隔空送祝福,双向奔赴甜蜜又浪漫

林更新考博成功,赵丽颖疑隔空送祝福,双向奔赴甜蜜又浪漫

深剖娱乐圈
2024-06-12 20:11:12
德国最大天然气进口商Uniper宣布终止与俄气出口公司的长期供气合同

德国最大天然气进口商Uniper宣布终止与俄气出口公司的长期供气合同

财联社
2024-06-12 19:24:17
古特雷斯回应为何缺席乌克兰和平峰会

古特雷斯回应为何缺席乌克兰和平峰会

参考消息
2024-06-13 09:58:09
苏州公布一批人事调整,涉多名副局长等

苏州公布一批人事调整,涉多名副局长等

鲁中晨报
2024-06-13 11:19:03
广东一52岁大爷天天吃油条,半年后去体检,医生奇怪:怎么会这样

广东一52岁大爷天天吃油条,半年后去体检,医生奇怪:怎么会这样

荷兰豆爱健康
2024-06-13 00:26:42
俄停止使用美元,美立马就要制裁。剑指中俄的同时却看到可怕一幕

俄停止使用美元,美立马就要制裁。剑指中俄的同时却看到可怕一幕

淡然小司
2024-06-13 08:34:23
美国杨毅当着乔治面暗讽伦纳德,乔治:别这么说

美国杨毅当着乔治面暗讽伦纳德,乔治:别这么说

懂球帝
2024-06-13 11:34:15
又赔了!大S欲哭无泪!具俊晔菲律宾演唱会跌破100块一张都卖不动

又赔了!大S欲哭无泪!具俊晔菲律宾演唱会跌破100块一张都卖不动

娱记掌门
2024-06-13 13:24:49
2024-06-13 14:46:44
数据不吹牛
数据不吹牛
趣味+实用数据分析
411文章数 4500关注度
往期回顾 全部

科技要闻

"在小红书,员工是实验品,不好用就扔掉"

头条要闻

包工头举报被索要25万"打点费" 中铁二十局:钱已充公

头条要闻

包工头举报被索要25万"打点费" 中铁二十局:钱已充公

体育要闻

国足,别辜负这场奇迹!

娱乐要闻

森林北报案,称和汪峰的感情遭受压力

财经要闻

徽商银行的影子 借基金向地方城投放贷?

汽车要闻

升级8155芯片 新款卡罗拉锐放将于今日上市

态度原创

时尚
教育
亲子
旅游
军事航空

中年女性不一定要买大牌!裙子买基础款、繁简搭配,舒适得体

教育要闻

2024年初中学业水平考试实验中学考场外,一名考生分享自己的考试经历,快来接好运!

亲子要闻

妈妈哄睡觉时拍宝宝,宝宝嫌妈妈拍疼了亲自做示范。

旅游要闻

山西文旅厅厅长与董宇辉拉家常:中午回家吃了饭

军事要闻

美军演习将罕见以4万吨级准航母作为靶舰

无障碍浏览 进入关怀版