python-正则表达式及应用(b站弹幕屏蔽)
目录
简介
正则表达式常用字符
定位符
元字符
修饰符
字符组
重复限定符
re模块
手机号判断
昵称判断
b站弹幕礼仪
b站弹幕屏蔽正则
长弹幕
个人信息
手机号
QQ号
日期
无意义
现场怪
视频顺序
开心
代码
(ABC)、[ABC]、[A|B|C]、[(ABC)]的区别
在线工具
可视化正则
在线匹配
高级篇
非获取匹配
正则分组与命名
分组引用
参考
简介
正则表达式(Regular Expression)是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
re 模块使 Python 语言拥有全部的正则表达式功能。
正则表达式常用字符
你可能没有了解过正则表达式,但却已经用过了部分。比如使用 rm -rf *.txt来删除所有.txt后缀的文件,*就是正则表达式中的符号之一。
定位符
定位符 | 说明 | 正则表达式举例说明 |
^ | 匹配字符串的开始,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。 | 方括号表达式中的使用,请查看字符组一节 |
$ | 匹配字符串的结尾,如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。 | 使用修饰符s时可包含换行符"\n" |
\b | 匹配一个单词边界,即字与空格间的位置。 | \bhello,可以匹配hello |
\B | 非单词边界匹配。 | \Bllo,可以匹配hello中的llo |
元字符
元字符 | 说明 | 正则表达式举例说明 |
. | 匹配任何字符(换行符除外) | "."可匹配"@" |
\d |
匹配数字,等价于 [0-9] | "\d"可匹配"9" |
\D |
匹配一个非数字字符,等价于 [^0-9]。 |
"\D"可匹配"a" |
\w |
匹配字母、数字、下划线,等价于'[A-Za-z0-9_]'。前提是设置了ASCII 标志。
|
"\w"可匹配"_" |
\W |
匹配非字母、数字、下划线,等价于 '[^A-Za-z0-9_]'。 |
"\W"可匹配"" |
\f |
匹配一个换页符。等价于 \x0c 和 \cL。 |
|
\n |
匹配一个换行符。等价于 \x0a 和 \cJ。 |
|
\r |
匹配一个回车符。等价于 \x0d 和 \cM。 |
|
\t |
匹配一个制表符。等价于 \x09 和 \cI。 |
|
\v |
匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
|
\s |
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
|
\S |
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
|
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。 | "\$"匹配"$" |
修饰符
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore - 不区分大小写 | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 |
g | global - 全局匹配 | 查找所有的匹配项。 |
m | multi line - 多行匹配 | 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
s | 特殊字符圆点 . 中包含换行符 \n | 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。 |
字符组
字符组 | 说明 | 举例 | 举例说明 |
---|---|---|---|
[...] | 匹配字符组里出现的任意一个字符 | [123abc] | |
[字符1-字符2] | 匹配从字符1到字符2的所有字符 | [0-9]、[a-z] | 匹配一个数字/英文小写字母 |
[^字符1-字符2] | 匹配未包含的任意字符。 | [^0-9]、[^a-z] | 匹配不包含数字/英文小写字母的一个字符 |
(正则表达式) | 匹配()内的正则表达式,可用于多个字符打包 | \d+(\.\d+)? | 简单浮点型(),一到多个数字,小数点,一到多个数字, |
重复限定符
重复限定符 | 说明 | 正则表达式样例 |
---|---|---|
* |
重复零次或更多次 |
hello!*可匹配hello!!!!等 |
+ |
重复一次或更多次 |
hello!+可匹配hello!等 |
? | 重复零次或一次 | hello!?可匹配hello、hello! |
{M,N} | 匹配前面出现的正则表达式M到N次 | [1-9][0-9]{1,2}可匹配二、三位整数 |
{N} | 匹配前面出现的正则表达式N次 | [1-9][0-9]{1}可匹配两位整数 |
{N,} | 匹配前面出现的正则表达式至少N次 | [1-9][0-9]{1}可匹配两位及以上整数 |
注意:不能将限定符与定位符一起使用。
re模块
函数 | 说明 |
---|---|
match(pattern, string, flags=0) |
尝试用正则表达式模式pattem 匹配字符串string,flags 是可选标识符,如果匹配成功,则返回一个匹配对象:否则返回None |
search(pattern, string, flags=0) |
在字符串string 中搜索正则表达式模式patterm的第一次出现,flags 是可选标识符,如果匹配成功,则返回一个匹配对象:否则返回None |
sub(pattern, repl, string, count=0, flags=0) |
把字符串string中所有匹配正则表达式patterm的地方替换成字符串repl,如果max的值没有给出,则对所有匹配的地方进行替换(另外,请参考subn(),它还会返回-一个表示替换次数的数值) |
findall(string[, pos[, endpos]]) |
在字符串string中搜索正则表达式模式pattemn的所有(非重复)出现:返回一个匹配对象的列表 |
finditer(pattern, string, flags=0) |
和findall0相同,但返回的不是列表而是迭代器:对于每个匹配,该迭代器返回一一个匹配对象 |
split(pattern, string[, maxsplit=0, flags=0]) |
根据正则表达式pattem中的分隔符把字符string分割为-个列表,返回成功匹配的列表,最多分割max次(默认是分割所有匹配的地方) |
匹配对象的方法 | |
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
手机号判断
貌似就是第二位没有2,其他的也没什么。
# 手机号
def phone_number():pattern = r'^1[3456789]\d{9}$'pho_number = '15732118829'res = re.match(pattern, pho_number)return res
昵称判断
假设昵称规则是数字,英文字母,下划线,不允许数字开头。
# 昵称 英文字母、数字、下划线
def nick_name():pattern = r'^[^\d]\w+$'pho_number = 'hbhWFEFf_哈哈'res = re.match(pattern, pho_number)return res
b站弹幕礼仪
1、不要轻易提及其他up主
2、不要用弹幕去挡字幕
3、杜绝毫无意义的刷屏
4、杜绝主观评价
5、不要用弹幕与人辩论和争吵
6、不要发一般人看不懂的外语
7、杜绝剧透
8、杜绝无意义低俗空耳
9、不要在弹幕提及个人信息
10、尽量避免长篇大论
11、不要在弹幕问无脑问题
12、不要发年月日期
来源:22娘关于弹幕礼仪的总结性讲演_哔哩哔哩_bilibili
b站弹幕屏蔽正则
长弹幕
屏蔽字数长度超过20的弹幕,不懂编程的小伙伴就改里面的数字就好。
/.{20,}/
个人信息
手机号
屏蔽国内11位手机号
/^1[3456789]\d{9}$/
QQ号
屏蔽腾讯QQ号,10000开始,目前11位。
/[1-9][0-9]{4,8}/
日期
屏蔽2-4位的年,1-2位的月,1-2位的日,使用汉字、“.”、“-”连接。例如,2020年8月9日,2020.8.10,20-8-11等。
/^\d{2,4}[年|\-|\.]\d{1,2}[月|\-|\.]\d{1,2}[日|号|.]*$/
无意义
现场怪
屏蔽类似:在现场、我在现场、当时在现场、才发现在现场这些弹幕
/^.*在现场$/
视频顺序
屏蔽类似:第一、第二个、前三、第5这些弹幕
/^(第|前)[零一二两俩三四五六七八九十\d]个?$/
开心
2后面多个3表示开心
/^23+$/
多个字重复,多个哈,多个6等,可以自行添加在后面[]中
/^[哈呵哼6xswlawsl]+嗝?$/
有哪些想要屏蔽的弹幕可以下方评论,如有时间我会编写正则并回复。
要求:
1.能够总结出规律
2.误杀率低
代码
import re# 手机号
def phone_number():pattern = r'^1[3456789]\d{9}$'pho_number = '15732118829'res = re.match(pattern, pho_number)return res# 昵称 英文字母、数字、下划线
def nick_name():pattern = r'^[^\d]\w+$'pho_number = 'hbhWFEFf_哈哈'res = re.match(pattern, pho_number)return resdef date1():pattern = r'^\d{2,4}[年|\-|\.]\d{1,2}[月|\-|\.]\d{1,2}[日|号|.]*$'# bullet = '2020.08.10'# bullet = '2020-08-10'# bullet = '20-08-10'# bullet = '2020年8月10日'bullet = '2020年08月10号'print(bullet)res = re.match(pattern, bullet)return resdef tooLong():pattern = r"^.{20,}$"# bullet = '短弹幕短弹幕短弹幕短弹幕短弹幕'bullet = '长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕'print(bullet)res = re.match(pattern, bullet)return resdef QQ():pattern = r"[1-9][0-9]{4,8}"# bullet = '1000'bullet = "1187276773"print(bullet)res = re.match(pattern, bullet)return resdef happy():pattern = r"^[哈呵哼6xswlawsl]+嗝?$"# bullet = "666666"# bullet = "哈哈哈哈"# bullet = "哈哈哈嗝"bullet = "awslawslawsl"print(bullet)res = re.match(pattern, bullet)return resdef shunxu():pattern = r"^(第|前)?[零一二两俩三四五六七八九十\d]+个?$"# bullet = "第二"# bullet = "前三"# bullet = "第二个"# bullet = "第5"bullet = "前三"print(bullet)res = re.match(pattern, bullet)return resdef xianchang():pattern = r"^.*在现场$"# bullet = "在现场"# bullet = "我在现场"bullet = "当时在现场"print(bullet)res = re.match(pattern, bullet)return resif __name__ == "__main__":# res = phone_number()# if res:# print('手机号注册成功!')# else:# print('请输入正确的手机号!')# ans = nick_name()# if ans:# print('账号注册成功!')# else:# print('账号不符合规则!')# ans = date1()# ans = tooLong()# ans = QQ()# ans = happy()# ans = shunxu()ans = xianchang()if ans:print('已屏蔽')else:print('无法屏蔽')
未完待续...
ps:为写本文,收集了弹幕,制作了两个视频
张大仙弹幕统计,仙友们来看看有没有你的弹幕吧!
b站弹幕设置与屏蔽正则
播放量太惨了,一首《凉凉》送给自己,逛b站的粉丝们去看下上面两个视频呗,十分感谢!
------------------2022-03-26更新--------------------
(ABC)、[ABC]、[A|B|C]、[(ABC)]的区别
()里面是正则表达式,只有ABC的时候才能匹配,不会匹配A、B、AB、BC之类的
[]是匹配任意一个,也就是匹配A、B、C,AB、ABC之类的不会匹配
这个是一种手误,或者有些人为了区分前两个,故意这样写的。会多匹配一个“|”,一般没什么影响
这种想法是想把 你好 作为一个进行匹配,但是和上面一样,会匹配(、你、好、),并不会匹配你好,想要匹配汉字词组,可以使用(()|())
-----------------2022-03-26更新完毕---------------
在线工具
可视化正则
Regulex:JavaScript Regular Expression Visualizer
通过上面的网站,可以更方便的写正则。
ihateregex
在线匹配
Regex Tester - Javascript, PCRE, PHP
上面的在线匹配应该是不行了,换一个:菜鸟正则测试
高级篇
非获取匹配
(?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。
例如,lady_killer9|lady_killers可以写成lady_killer(?:9|s)
(?=pattern) 非获取匹配,正向肯定预查,匹配后面是pattern的数据,该匹配不需要获取供以后使用。
例如,相匹配lady_killer9中的lady_killer但是不想匹配lasy_killers中的lady_killer,可以写成lady_killer(?=9)
(?!pattern) 非获取匹配,正向否定预查,匹配后面不是pattern的数据,该匹配不需要获取供以后使用。
例如,有如下需求需要匹配
小写字母、数字组合,不能纯数字或者纯字母,6-16个字符。
请读者自行实验~
(?<=pattern) 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反,即匹配前面是pattern的数据。
例如,匹配前面是lady_killer的9
(?<!pattern) 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反,即匹配前面不pattern的数据。
例如,有如下需求需要匹配
小写字母、数字组合,可以有下划线,但不能以下划线开头
请读者自行实验~
正则分组
分组内部引用
当你要匹配单引号或双引号包裹的数据时,你可能这样写
['"].*['"]
但是结果却是不对的,因为可能出现这种情况
那我们怎么知道前面匹配了什么呢?这是可以在正则中分组并在后面引用
(['"]).*\1
代码
def test_group_ref():pattern = r"""(['"]).*\1"""str1 = "'hi'"str2 = "'hi\""res1 = re.match(pattern,str1)if res1:print("找到了str1")res2 = re.match(pattern,str2)if res2:print("找到了str2")
分组获取与命名
.group(index)获取分组结果,0是整个数据
在分组()内的前面写上?P<group_name>即可命名,正则新加分组时,不用索引的代码就不用动了,.group(group_name)获取name分组结果
代码:
def test_group_name():pattern = "https://([a-z.]+)/([a-z\d_.]+)/article/details/(\d+)"blog1 = "https://blog.csdn.net/lady_killer9/article/details/107630277"blog2 = "https://blog.csdn.net/lady_killer9/article/details/xxxx"res1 = re.match(pattern,blog1)res2 = re.match(pattern,blog2)if res1:print("res1:")print(res1.group(0))print(res1.group(1))print(res1.group(2))print(res1.group(3))if res2:print("res2:")print(res1.group(0))print(res1.group(1))print(res1.group(2))print(res1.group(3))pattern_name = "https://(?P<domain>[a-z.]+)/(?P<blogger>[a-z\d_.]+)/article/details/(\d+)"res3 = re.match(pattern_name, blog1)if res3:print("res3:")print(res3.group(0))print(res3.group(1))print(res3.group('blogger'))print(res3.group(2))print(res3.group(3))
全部代码:
import redef test_group_ref():pattern = r"""(['"]).*\1"""str1 = "'hi'"str2 = "'hi\""res1 = re.match(pattern,str1)if res1:print("找到了str1")res2 = re.match(pattern,str2)if res2:print("找到了str2")def test_group_name():pattern = "https://([a-z.]+)/([a-z\d_.]+)/article/details/(\d+)"blog1 = "https://blog.csdn.net/lady_killer9/article/details/107630277"blog2 = "https://blog.csdn.net/lady_killer9/article/details/xxxx"res1 = re.match(pattern,blog1)res2 = re.match(pattern,blog2)if res1:print("res1:")print(res1.group(0))print(res1.group(1))print(res1.group(2))print(res1.group(3))if res2:print("res2:")print(res1.group(0))print(res1.group(1))print(res1.group(2))print(res1.group(3))pattern_name = "https://(?P<domain>[a-z.]+)/(?P<blogger>[a-z\d_.]+)/article/details/(\d+)"res3 = re.match(pattern_name, blog1)if res3:print("res3:")print(res3.group(0))print(res3.group(1))print(res3.group('blogger'))print(res3.group(2))print(res3.group(3))if __name__ == '__main__':# test_group_ref()test_group_name()
运行截图:
参考
b站张大仙20200810投稿所有视频弹幕
python3.7官方文档:re---正则表达式操作
learn-regix
《python核心编程》
知乎-你最讨厌B站有哪些类型的弹幕?
知乎-你为什么看哔哩哔哩不看弹幕了?
更多python相关内容:【python总结】python学习框架梳理
本人b站账号:lady_killer9
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。
python-正则表达式及应用(b站弹幕屏蔽)相关推荐
- 我用Python爬取了“b站弹幕大军,告诉你什么才是真正的“雨女无瓜”
"网上冲浪""886""GG""沙发"--如果你用过这些,那你可能是7080后: "杯具"" ...
- Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云
一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...
- python爬取b站403_python3——爬取B站弹幕
在简书发现一篇有趣的文章:爬虫,走起,用Excel实现5min抓取B站弹幕及初步处理 讲到了如何根据开发者工具,获得B站视频的弹幕信息,不过有个不足就是手动保存弹幕信息.而通过python我们可以轻松 ...
- Python爬取B站弹幕方法介绍
Python爬取B站弹幕方法介绍 文章目录 Python爬取B站弹幕方法介绍 前言 寻找弹幕数据 编写爬虫 B站弹幕数量 新技术介绍 参考文章 前言 最近同学要做东西,需要用 B 站的视频对应的弹幕数 ...
- python接收弹幕_闲着没事,尝试一下用Python爬取B站弹幕呀~
原标题:闲着没事,尝试一下用Python爬取B站弹幕呀~ 前言 最近同学要做东西,需要用 B 站的视频对应的弹幕数据做分析,于是请我帮忙爬取 B 站视频的弹幕数据. 对于爬虫而言,我们需要找到对应数据 ...
- 爬虫数据云词图片怎么做?小姐姐教你用python做B站弹幕爬虫,并进行数据分析生成词云
hello大家好,我是你们的可爱丸,大家平时在B站看视频时有没有开弹幕的习惯呢?如果不把视频从头看到尾,那么多弹幕,我们怎么快速的知道大家都说了些什么并且持有什么观点呢? 今天小姐姐就教你做一个简单的 ...
- python爬虫和定位_Python网络爬虫实战,照片定位与B站弹幕!
之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. Python资源共享群:626017123 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位 ...
- python爬虫和定位_Python网络爬虫实战(三)照片定位与B站弹幕
之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...
- python控制流水灯_B站智能防挡弹幕的一种python实现
某天代码写得老眼昏花,去B站上摸鱼,突然发现奇怪的现象: 哟呵,B站竟然做了视频前景提取,把弹幕藏到画面人物的后面.识别效果还意外地不错呢. 然后又翻了下,发现这是个叫做"智能防挡弹幕&qu ...
最新文章
- tomcat-清除缓存
- 发现自己的BLOG被转载了
- 一文读懂HttpServletRequest
- 使用C#开发一个简单的P2P应用
- SAP API Business Hub 上测试 API 的一些常见问题
- aix么把占用的端口释放掉_AIX 环境下Telnet返回提示所有端口已经被占用,处理方法...
- 持续集成(CI)- 各种工具的资料总结
- mysql更新id最大_我们可以在单个MySQL查询中更新具有最高ID的行吗?
- c#推箱子小游戏代码_用C#制作推箱子小游戏
- 鱼哥,我怕蛇,可以搞Python么?
- 使用EDD枚举域数据
- 环境管理体系ISO14001认证常见的审核问题有哪些?
- 服务器主机防护系统有哪些,什么是DDoS防护主机?
- Python0基础(中)——期末不挂科
- [计算机毕业设计]数字水印算法
- 手动卸数+传输文件+入库
- 精确到秒!一位清华学霸的学习生活计划表,值得借鉴!
- 加密冷存储钱包-市场现状及未来发展趋势
- Big-man进军Linux系统(一)
- Tree Map:树状图——绘制COVID-19阵列图
热门文章
- php 数组字符串输出,php遍历数组输出成字符串例子
- 用友NC产品接口开发,通过轻易云数据集成平台快速调用
- 单片机p0口接8个LED c51语言,51单片机P1口接8个LED灯,低电平点亮,用定时器1定时250ms,让着8个LED不停闪烁,编写完整的C程序。...
- Linux鼠标变成十字无法点击的解决方法
- 一个Android大专应届生的2020
- 【Xshell命令】常用命令,解决报错 -bash: cd: too many arguments
- git-如何同步上游服务的分支
- Centos安装/卸载Docker步骤
- 2018.12.10:中断三个月的python学习又接上了
- T​o​m​c​a​t​ ​登​陆​问​题​ 创​建​用​户​名​密​码