正则表达式使用

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 mn均为非负整数,其中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 的符号来引用 
匹配一个数字字符,等价于[0-9] 
D 匹配一个非数字字符,等价于[^0-9] 
匹配一个制表符 
匹配包括下划线的任何单词字符 
 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()

以上是关于正则表达式使用的主要内容,如果未能解决你的问题,请参考以下文章

text 正则表达式片段

markdown 正则表达式模式片段

循环通过 python 正则表达式匹配

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

攻破难啃的骨头-正则表达式(转)

JavaScript中 正则表达式的使用 及 常用正则表达式