正则表达式使用
Posted baobao2201128470
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式使用相关的知识,希望对你有一定的参考价值。
简介
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
作用
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分或进行替换。
符号
正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,下面将详解一些常用的元字符;
元字符 | 描述 |
转义字符,例如:“\n”匹配 。“ ”匹配换行符。序列“\”匹配“”而“(”则匹配“(” | |
^ | 匹配输入行首 |
$ | 匹配输入行尾 |
* | 匹配前面的子表达式任意次,例如:zo*能匹配“z”,也能匹配“zo”以及“zoo”,*等价于{0,} |
+ | 匹配前面的子表达式一次或多次(大于等于1次),例如:“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”,+等价于{1,} |
? | 匹配前面的子表达式零次或一次,例如:“do(es)?”可以匹配“do”或“does”,?等价于{0,1} |
{n} | n是一个非负整数。匹配确定的n次,例如:“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o |
{n,} | n是一个非负整数,至少匹配n次,例如:“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o,“o{1,}”等价于“o+”,“o{0,}”则等价于“o*” |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次,例如:“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 |
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的,非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串,例如:对于字符串“oooo”,“o+”将尽可能多地匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少地匹配“o”,得到结果 [‘o‘, ‘o‘, ‘o‘, ‘o‘] |
.(点) | 匹配除“ ”和" "之外的任何单个字符 |
x|y | 匹配x或y,例如:“z|food”能匹配“z”或“food”(此处请谨慎),“[z|f]ood”则匹配“zood”或“food” |
[xyz] | 字符集合,匹配所包含的任意一个字符,例如:“[abc]”可以匹配“plain”中的“a” |
[^xyz] | 负值字符集合,匹配未包含的任意字符,例如:“[^abc]”可以匹配“plain”中的“plin”任一字符 |
[a-z] |
字符范围,匹配指定范围内的任意字符,例如:“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符,
注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身
|
[^a-z] | 负值字符范围,匹配任何不在指定范围内的任意字符,例如:“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符 |
( ) | 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 1 到9 的符号来引用 |
d | 匹配一个数字字符,等价于[0-9] |
D | 匹配一个非数字字符,等价于[^0-9] |
匹配一个制表符 | |
w | 匹配包括下划线的任何单词字符 |
W | 匹配任何非单词字符,等价于“[^A-Za-z0-9_]” |
常用正则表达式实例
1.验证用户名和密码:("^[a-zA-Z]w{5,15}$"),含义:第一个字必须为字母且后面为5~15位的数字或字母或下划线;
2.验证手机号码(包含虚拟号码和新号码段):"^1([38][0-9]|4[5-9]|5[0-3,5-9]|66|7[0-8]|9[89])[0-9]{8}$";
3.验证身份证号(15位):"^([1-6][1-9]|50)d{4}d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)d{3}$" (18位):"^([1-6][1-9]|50)d{4}(18|19|20)d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$";
4.验证Email地址:"(w+.)*w+@(w+.)+[a-zA-Z]+";
5.只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$";
6.只能输入长度为3的字符:"^.{3}$";
7.验证URL:"^https?://([w-]+.)+[w-]+(/[w-./?%&=]*)?$";
8.只能输入汉字:"^[u4e00-u9fa5]{0,}$";
9.匹配腾讯QQ号:"^[1-9][0-9]{4,11}$",注:QQ号码从10000开始;
10.匹配中国邮政编码:"^[1-9]d{5}$";
11.匹配html注释:"<!-{2,}.*?-{2,}>";
12.匹配IP地址:"(((d{1,2})|(1d{2})|(2[0-4]9)|(25[0-5])).){3}((d{1,2})|(1d{2})|(2[0-4]9)|(25[0-5]))";
示例(以python为例)
例1:验证输入用户名和QQ号及邮箱是否有效并给出对应的提示信息
import re def main(): username=input(‘请输入你的用户名:‘) m1=re.match(r‘^[0-9a-zA-Z]{6,20}$‘,username) if not m1: print(‘你输入的用户名无效‘) qq = input(‘请输入你的QQ号:‘) m2=re.match(r‘^[1-9]d{4,11}$‘,qq) if not m2: print(‘你输入的qq号无效‘) email = input(‘请输入你的邮箱:‘) m3=re.match(‘(w+.)*w+@(w+.)+[a-zA-Z]+‘,email) if not m3: print(‘你输入的邮箱无效‘) if m1 and m2 and m3: print(‘你输入的信息有效‘) if __name__==‘__main__‘: main()
例2:替换字符串中的不良内容
import re def main(): sentence = ‘你丫是傻叉吗? 我操你大爷的. Fuck you.‘ purified = re.sub(‘[操肏艹]|fuck|shit|傻[比屄逼叉缺吊屌]|煞笔‘, ‘*‘, sentence, flags=re.IGNORECASE) print(purified) # 你丫是*吗? 我*你大爷的. * you. if __name__ == ‘__main__‘: main()
以上是关于正则表达式使用的主要内容,如果未能解决你的问题,请参考以下文章