应用场景:  

    1、判断某一个字符串是否符合规则  (注册时:判断手机号,身份证号,邮箱格式是否正确)

    2、将符合规则的内容从一个庞大的字符串体系中提取出来  (爬虫,日志分析)

  什么是正则表达式:

    只和字符串打交道,是一种规则,来约束字符串的规则

    在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用 [ ] 表示。

    字符分为很多类,比如数字,字母,标点等等。

    [0123456789]  表示0-9都可以匹配

    [0-9]       用 – 表示范围,[0-9] 和 [0123456789] 是一样的

    [a-z]       表示所有的小写字母

    [A-Z]      表示所有的大写字母

    [0-9a-fA-F]    可以匹配数字,大小写形式的a~f,常用来验证十六进制字符

    原理是通过ASCII编码,小的一个值指向大的一个值

    \w  匹配字母或数字或下划线

    \W    匹配非字母或非数字或非下划线

    \s   匹配任意的空白符(空格、换行\n、制表符\t)

    \S  匹配非空白符

    \d  匹配数字

    \D  匹配非数字

    \n  匹配一个换行符

    \t   匹配一个制表符

    \b  匹配一个单词的边界

    \A  匹配以什么开头,与 ^ 的功能一样  (\A匹配内容)

    \Z  匹配以什么结尾,与 $ 的功能一样  (匹配内容\Z)

    .    匹配除换行符以外的任意字符

    ^    匹配字符串的开始

    $   匹配字符串的结尾

    a|b   匹配字符a或字符b  (把长的放前面,如 abc|ab)

    ()   匹配括号内的表达式,也表示一个组

    […]   匹配字符组中的字符

    [^…]  匹配除了字符组中字符的所有字符

    *    重复零次或更多次

    +   重复一次或更多次

    ?  重复零次或一次

    {n}    重复n次

    {n,}   重复n次货更多次

    {n,m} 重复n到m次

  注意:前面的 *,+,? 等都是贪婪匹配,也就是尽可能多的匹配,后面加?使其变成惰性匹配

身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位的,则前17位全部是数字,末位可以是数字或x

在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的”\n”而不是”换行符”就需要对”\”进行转义,变成\’\\\’。

 贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配

  几个常用的非贪婪匹配

    *?    重复任意次,但尽可能少重复

    +?   重复1次或更多次,但尽可能少重复

    ??   重复0次或1次,但尽可能少重复

    {n,m}?  重复n到m次,但尽可能少重复

    {n,}?  重复n次以上,但尽可能少重复

    .  是任意字符

    *  是取 0 至 无限长度

    ?  是非贪婪模式

    合在一起就是,取尽量少的任意字符,一般不会这么单独写,大多用在:

    . * ? x  就是取前面任意长度的字符,直到一个 x 出现

  1. import re
  2. # \w与\W
  3. print(re.findall(\'\w\', \'hello egon 123\'))
  4. # [\'h\', \'e\', \'l\', \'l\', \'o\', \'e\', \'g\', \'o\', \'n\', \'1\', \'2\', \'3\']
  5. print(re.findall(\'\W\', \'hello egon 123\'))
  6. # [\' \', \' \']
  7.  
  8. # \s与\S
  9. print(re.findall(\'\s\', \'hello egon 123\'))
  10. # [\' \', \' \']
  11. print(re.findall(\'\S\', \'hello egon 123\'))
  12. # [\'h\', \'e\', \'l\', \'l\', \'o\', \'e\', \'g\', \'o\', \'n\', \'1\', \'2\', \'3\']
  13.  
  14. # \n与\t都是空,都可以被\s匹配
  15. print(re.findall(\'\s\', \'hello \n egon \t 123\'))
  16. # [\' \', \'\n\', \' \', \' \', \'\t\', \' \']
  17.  
  18. # \n与\t
  19. print(re.findall(r\'\n\', \'hello egon \n123\'))
  20. # [\'\n\']
  21. print(re.findall(r\'\t\', \'hello egon \t 123\'))
  22. # [\'\t\']
  23.  
  24. # \d与\D
  25. print(re.findall(\'\d\', \'hello egon 123\'))
  26. # [\'1\', \'2\', \'3\']
  27. print(re.findall(\'\D\', \'hello egon 123\'))
  28. # [\'h\', \'e\', \'l\', \'l\', \'o\', \' \', \'e\', \'g\', \'o\', \'n\', \' \']
  29.  
  30. # \A与\Z
  31. print(re.findall(\'\Ahe\', \'hello egon 123\'))
  32. # [\'he\']
  33. print(re.findall(\'123\Z\', \'hello egon 123\'))
  34. # [\'123\']
  35.  
  36. # ^与$
  37. print(re.findall(\'^he\', \'hello egon 123\'))
  38. # [\'he\']
  39. print(re.findall(\'123$\', \'hello egon 123\'))
  40. # [\'123\']
  41.  
  42. # 重复匹配:. * ? .* .*? + {n,m} |
  43.  
  44. # .
  45. print(re.findall(\'a.b\', \'a1b\'))
  46. # [\'a1b\']
  47. print(re.findall(\'a.b\', \'a1b a*b a b aaab\'))
  48. # [\'a1b\', \'a*b\', \'a b\', \'aab\']
  49. print(re.findall(\'a.b\', \'a\nb\'))
  50. # []
  51.  
  52. # *
  53. print(re.findall(\'ab*\', \'bbbbbbb\'))
  54. # []
  55. print(re.findall(\'ab*\', \'a\'))
  56. # [\'a\']
  57. print(re.findall(\'ab*\', \'abbbbbb\'))
  58. # [\'abbbbbb\']
  59.  
  60. # ?
  61. print(re.findall(\'ab?\', \'a\'))
  62. # [\'a\']
  63. print(re.findall(\'ab?\', \'abbbb\'))
  64. # [\'ab\']
  65.  
  66. # 匹配所有包含小数在内的数字
  67. print(re.findall(\'\d+\.?\d*\', \'sdfsdfs231sdsd1.123sdfsfas34jk23kj52k3jh4kj\'))
  68. # [\'231\', \'1.123\', \'34\', \'23\', \'52\', \'3\', \'4\']
  69.  
  70. # .*默认为贪婪匹配
  71. print(re.findall(\'a.*b\', \'a1b222222222b\'))
  72. # [\'a1b222222222b\']
  73.  
  74. # .*? 为非贪婪匹配:推荐使用
  75. print(re.findall(\'a.*?b\', \'a1b22222222b\'))
  76. # [\'a1b\']
  77.  
  78. # +
  79. print(re.findall(\'ab+\', \'a\'))
  80. # []
  81. print(re.findall(\'ab+\', \'abbb\'))
  82. # [\'abbb\']
  83.  
  84. # {n,m}
  85. print(re.findall(\'ab{2}\', \'abbbb\'))
  86. # [\'abb\']
  87. print(re.findall(\'ab{2,4}\', \'abbb\'))
  88. # [\'abbb\']
  89. print(re.findall(\'ab{1,}\', \'abbbbbb\'))
  90. # [\'abbbbbb\']
  91. print(re.findall(\'ab{0,}\', \'a\'))
  92. # [\'a\']
  93.  
  94. #[]
  95. print(re.findall(\'a[1*-]b\', \'a1b a*b a-b\'))
  96. # [\'a1b\', \'a*b\', \'a-b\'] []内的都为普通字符了,且如果-没有被转意的话,应该放到[]的开头或结尾
  97. print(re.findall(\'a[^1*-]b\', \'a1b a*b a-b a=b\'))
  98. # [\'a=b\'] []内的^代表的意思是取反,所以结果为[\'a=b\']
  99. print(re.findall(\'a[0-9]b\', \'a1b a*b a-b a=b\'))
  100. # [\'a1b\']
  101. print(re.findall(\'a[a-z]b\', \'a1b a*b a-b a=b aeb\'))
  102. # [\'aeb\']
  103. print(re.findall(\'a[a-zA-Z]b\', \'a1b a*b a-b a=b aeb aEb\'))
  104. # [\'aeb\', \'aEb\']
  105.  
  106. # 转义\
  107. print(re.findall(\'a\\c\', \'a\c\'))
  108. # 对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
  109. print(re.findall(r\'a\\c\', \'a\c\'))
  110. # [\'a\\c\'] r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
  111. print(re.findall(\'a\\\\c\', \'a\c\'))
  112. # 同上面的意思一样,和上面的结果一样都是[\'a\\c\']
  113.  
  114. # ()分组
  115. print(re.findall(\'ab+\', \'ababab123\'))
  116. # [\'ab\', \'ab\', \'ab\']
  117. print(re.findall(\'(ab)+123\', \'ababab123\'))
  118. # [\'ab\'],匹配到末尾的ab123中的ab
  119. print(re.findall(\'(?:ab)+123\', \'ababab123\'))
  120. # [\'ababab123\'] findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
  1. import re
  2. # findall
  3. print(re.findall(\'\d\', \'sdfh34h2h423h2h23h\'))
  4. # [\'3\', \'4\', \'2\', \'4\', \'2\', \'3\', \'2\', \'2\', \'3\']
  5. # 返回值是一个列表,里面的每个元素是所有匹配到的项
  6.  
  7.  
  8. # search
  9. ret = re.search(\'\d\', \'sdfh34h2h423h2h23h\')
  10. print(ret)
  11. # <re.Match object; span=(4, 5), match=\'3\'>
  12. print(ret.group())
  13. # 3
  14. ret = re.search(\'\d\', \'sdhfsd\')
  15. print(ret)
  16. # None
  17. if ret:
  18. print(ret.group())
  19. # search返回值:
  20. # 返回一个re_Match对象
  21. # 通过group取值
  22. # 且只包含第一个匹配到值
  1. import re
  2. # findall 有一个特点,会优先显示分组中的内容
  3. ret = re.findall(\'www.(baidu|oldboy).com\', \'www.baidu.com\')
  4. print(ret)
  5. # [\'baidu\']
  6. ret = re.search(\'www.(baidu|oldboy).com\', \'www.baidu.com\')
  7. print(ret)
  8. # <re.Match object; span=(0, 13), match=\'www.baidu.com\'>
  9. print(ret.group())
  10. # www.baidu.com

 

版权声明:本文为zyling原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zyling/p/12780362.html