在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。学了这个现在还是很懵逼,还好以后应用时可以先去网上搜搜正则表达大全,另外推荐大家《正则表达式30分钟入门教程》。读完这篇文章后再来看看下面的表格,也许你会有更多收获。

有时候我们会用到正则表达式中的特殊字符,这时候可以使用\进行转义处理,比如想匹配小数点可以写成“.”就可以了,因为直接写“.”会匹配任意字符;同理,想匹配圆括号必须写成"("和")",否则圆括号被视为正则表达式中的分组。
Python中的re模块
python中的re模块支持正则表达式的操作,下表列出了该模块的核心参数,当我们设计的正则表达式太长或要重复使用时时,可以先放在compile里面,以后直接调用。

习题1:验证用户名和qq号码是否满足条件
"""
要求:
用户名必须由字母、数字或下划线构成且长度在6~20个字符之间
QQ号是5~12的数字且首位不能为0
"""
import re
def main():
username = input('请输入用户名: ')
qq = input('请输入QQ号: ')
# match函数的第一个参数是正则表达式字符串或正则表达式对象
# 第二个参数是要跟正则表达式做匹配的字符串对象
m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
if not m1:
print('请输入有效的用户名.')
m2 = re.match(r'^[1-9]\d{4,11}$', qq)
if not m2:
print('请输入有效的QQ号.')
if m1 and m2:
print('你输入的信息是有效的!')
if __name__ == '__main__':
main()
正则表达式中加“r”表示使用“原始字符串”的写法,即在字符串中没有所谓的转义字符,如果没有使用,你要在字符串中用‘\’就要打‘\\’表示,这样非常繁琐而且容易出错,可读性不强。
习题2:从文字段落中提取国内手机号码

import re
def main():
# 创建正则表达式对象 使用了前瞻和回顾来保证手机号前后不应该出现数字
pattern = re.compile(r'(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D)')
sentence = '''
重要的事情说8130123456789遍,我的手机号是13512346789这个靓号,
不是15600998765,也不是110或119,王大锤的手机号才是15600998765。
'''
# 查找所有匹配并保存到一个列表中
mylist = re.findall(pattern, sentence)
print(mylist)
print('--------华丽的分隔线--------')
# 通过迭代器取出匹配对象并获得匹配的内容
for temp in pattern.finditer(sentence):
print(temp.group())
print('--------华丽的分隔线--------')
# 通过search函数指定搜索位置找出所有匹配
m = pattern.search(sentence)
while m:
print(m.group())
m = pattern.search(sentence, m.end())
if __name__ == '__main__':
main()
习题3:一般游戏聊天界面都会屏蔽一些不良字眼,可用正则表达式实现
import re
def main():
sentence = '你丫是傻叉吗? 我操你大爷的. Fuck you.'
#flags参数代表了匹配标记,可以通过它来指定匹配时是否忽略大小写、是否进行多行匹配等等,如果flags参数有多个值,写成flags=re.I | re.M。
purified = re.sub('[操肏艹草曹]|fuck|shit|傻[比屄逼叉缺吊屌]|煞笔','*', sentence, flags=re.IGNORECASE)
print(purified) # 你丫是*吗? 我*你大爷的. * you.
if __name__ == '__main__':
main()
习题4:拆分长字符串
import re
def main():
poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
sentence_list = re.split(r'[,。, .]', poem)
while '' in sentence_list:
sentence_list.remove('')
print(sentence_list) # ['窗前明月光', '疑是地上霜', '举头望明月', '低头思故乡']
if __name__ == '__main__':
main()
浙公网安备 33010602011771号