Python正则表达式总结

 写在前面

一篇正则小笔记。断断续续看过正则的一些知识,总感觉要记的挺多,每次都随手一写,然后由于使用的机会也不多所以啊永远是看了忘忘了看。

正则表达式是一些由字符和特殊符号组成的字符串,能按照某种模式匹配一系列有相似特征的字符串。Python中通过标准库中的re模块来支持正则表达式。当然,正则表达式并不是python所特有的,在其他语言中也是支持的,其中关于正则表达式的部分是一样的,只是可能调用的一些函数会有简单区别。

正则表达式语法

在实际解决问题中,需要匹配的文本模式有很多,当然这里的语法也就会有很多。下面是一个关于正则表达式的小册子

Python正则表达式总结_第1张图片

Python正则表达式总结_第2张图片

练习与验证工具

emmmm,掌握一种技能的方式不外乎是反复地练习,如果你也有这个想法,可以试试下面这个正则表达式的练习网站:Regex Golf。

或者你只是想自己尝试一下上面小册子里的语法,可以去这个正则表达式匹配网站进行验证:正则表达式在线验证。

Good Luck!

常用正则表达式

校验数字的表达式

  1. 数字: ^[0-9]*$
  2. n位的数字:^\d{n}$
  3. 至少n位的数字: ^\d{n,}$
  4. m-n位的数字: ^\d{m,n}$
  5. 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
  6. 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
  7. 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
  8. 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

校验字符的表达式

  1. 汉字:^[\u4e00-\u9fa5]{0,}$
  2. 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 
  3. 长度为3-20的所有字符:^.{3,20}$
  4. 由26个英文字母组成的字符串:^[A-Za-z]+$
  5. 5. 由26个大写英文字母组成的字符串:^[A-Z]+$
  6. 6. 由26个小写英文字母组成的字符串:^[a-z]+$
  7. 7. 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
  8. 8. 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
  9. 9. 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  10. 10. 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  11. 11. 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止输入含有~的字符:[^~\x22]+

特殊需求表达式

  1. 1. Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  2. 2. 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  3. 3. InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  4. 4. 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  5. 5. 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  6. 6. 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
  7. 7. 身份证号(15位、18位数字):^\d{15}|\d{18}$
  8. 8. 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
  9. 9. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  10. 10. 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
  11. 11. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  12. 12. 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  13. 13. 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
  14. 14. 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
  15. 15. 钱的输入格式:
  16. 16. 1.有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
  17. 17. 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
  18. 18. 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
  19. 19. 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
  20. 20. 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
  21. 21. 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
  22. 22. 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
  23. 23 8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
  24. 24. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
  25. 25. xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
  26. 26. 中文字符的正则表达式:[\u4e00-\u9fa5]
  27. 27. 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
  28. 28. 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
  29. 29. HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
  30. 30. 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
  31. 31. 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
  32. 32. 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
  33. 33. IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
  34. 34. IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

Python案例

掌握了以上正则表达式的语法以后,当然要结合代码进行应用。在python语言里面,通过re模块进行对正则表达式的支持。

使用re的一般步骤是:

  1. 利用compile方法将正则表达式的字符串形式编译为一个Pattern实例;
  2. 利用match方法处理文本并获得匹配结果;
  3. 使用match实例获得信息,进行其他相应操作。
import re

#将正则表达式编译成一个pattern对象
pattern = re.compile(r'hello.*\!')

#使用pattern匹配文本,获得匹配结果,无法匹配时返回None
match = pattern.match('hello, kaiyuan! Where are you from?')
if match:
    #输出match获得的分组xinx
    print(match.group())

"""
结果应该是
hello,kaiyuan!
"""

re.compile(strPattern[,flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。

第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。

当然,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)等价于re.compile('(?im)pattern')

flag可选值有:

  • re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
  • re.M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
  • re.S(DOTALL): 点任意匹配模式,改变'.'的行为
  • re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
  • re.U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
  • re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:
regex_1 = re.compile(r"""\d +  # 数字部分
                         \.    # 小数点部分
                         \d *  # 小数的数字部分""", re.X)
regex_2 = re.compile(r"\d+\.\d*")

 

Match

Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获得这些信息。

match属性

  • string: 匹配时使用的文本。
  • re: 匹配时使用的Pattern对象。
  • pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
  • endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
  • lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
  • lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。

match方法

  • group([group1, …]): 
    获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。
  • groups([default]): 
    以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。
  • groupdict([default]): 
    返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。
  • start([group]): 
    返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。
  • end([group]): 
    返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。
  • span([group]): 
    返回(start(group), end(group))。
  • expand(template): 
    将匹配到的分组代入template中然后返回。template中可以使用\id或\g、\g引用分组,但不能使用编号0。\id与\g是等价的;但\10将被认为是第10个分组,如果你想表达\1之后是字符'0',只能使用\g<1>0。

Pattern

pattern对象是一个编译好的正则表达式,通过python提供的一些列方法可以对文本进行匹配查找。

pattern不能直接实例化,必须使用re.compile()进行构造

Pattern提供了几个可读属性用于获取表达式的相关信息:

  • pattern: 编译时用的表达式字符串。
  • flags: 编译时用的匹配模式。数字形式。
  • groups: 表达式中分组的数量。
  • groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。

以上~

你可能感兴趣的:(NLP)