python-正则表达式及应⽤(b站弹幕屏蔽)
⽬录
简介
正则表达式(Regular Expression)是⼀个特殊的字符序列,它能帮助你⽅便的检查⼀个字符串是否与某种模式匹配
re 模块使 Python 语⾔拥有全部的正则表达式功能。
正则表达式常⽤字符
你可能没有了解过正则表达式,但却已经⽤过了部分。⽐如使⽤ rm -rf *.txt来删除所有.txt后缀的⽂件,*就是正则表达式中的符号之⼀。元字符
常⽤元字符
元字符说明正则表达式举例说明
^匹配字符串的开始,除⾮在⽅括号表达式中使⽤,当该符号在⽅括号表达式中使⽤时,表
⽰不接受该⽅括号表达式中的字符集合。
⽅括号表达式中的使⽤,请查看字符组⼀节
$匹配字符串的结尾,如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或
'\r'。
使⽤修饰符s时可包含换⾏符"\n"
.匹配任何字符(换⾏符除外)"."可匹配"@"
\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 = '157********'
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、不要发年⽉⽇期
来源:
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 = '157********'
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
def 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 res
def tooLong():
pattern = r"^.{20,}$"
# bullet = '短弹幕短弹幕短弹幕短弹幕短弹幕'
bullet = '长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕长弹幕'    print(bullet)
res = re.match(pattern, bullet)
return res
def QQ():
pattern = r"[1-9][0-9]{4,8}"
# bullet = '1000'
bullet = "1187276773"
print(bullet)
res = re.match(pattern, bullet)
return res
def happy():
僧服
pattern = r"^[哈呵哼6xswlawsl]+嗝?$"
# bullet = "666666"
# bullet = "哈哈哈哈"
# bullet = "哈哈哈嗝"
bullet = "awslawslawsl"
print(bullet)
res = re.match(pattern, bullet)
return res