1. # 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
  2. # 在正则表达式中,如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字
  3. '''
  4. '00\d'可以匹配'007',但无法匹配'00A';
  5. '\d\d\d'可以匹配'010';
  6. '\w\w\d'可以匹配'py3';
  7. '''
  8. # .可以匹配任意字符,所以:
  9. '''
  10. 'py.'可以匹配'pyc'、'pyo'、'py!'等等。
  11. '''
  12. # 用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:
  13. '''
  14. 来看一个复杂的例子:\d{3}\s+\d{3,8}。
  15. 我们来从左到右解读一下:
  16. \d{3}表示匹配3个数字,例如'010';
  17. \s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' ',' '等;
  18. \d{3,8}表示3-8个数字,例如'1234567'。
  19. 综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。
  20. 如果要匹配'010-12345'这样的号码呢?由于'-'是特殊字符,在正则表达式中,要用'\'转义,所以,上面的正则是\d{3}\-\d{3,8}。
  21. '''
  22. # 要做更精确地匹配,可以用[]表示范围,比如:
  23. '''
  24. [0-9a-zA-Z\_]可以匹配 一个 数字、字母或者下划线;
  25. [0-9a-zA-Z\_]+可以匹配至少由 一个 数字、字母或者下划线组成的字符串,比如'a100''0_Z''Py3000'等等;
  26. [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接 任意个 由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
  27. [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
  28. '''
  29. # A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。
  30. # ^表示行的开头,^\d表示必须以数字开头。
  31. # $表示行的结束,\d$表示必须以数字结束。
  32. # 例如:^py$就变成了整行匹配,就只能匹配'py'了。
  33. # re模块:Python提供re模块,包含所有正则表达式的功能。
  34. # 要特别注意的是,由于Python的字符串本身也用\转义,因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了
  35. import re
  36. re.match(r'\d{3}\-\d{3,8}$0','010-12345')
  37. # match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。
  38. test = '010-12345'
  39. if re.match(r'\d{3}\-\d{3,8}$','010-12345'):
  40. print('ok')
  41. else:
  42. print('failed')
  43. # 切分
  44. # 首先是常见的切分代码:
  45. L = 'a b c'.split(' ')
  46. print(L)
  47. # 无法识别连续的空格,用正则表达式试试:
  48. L = re.split(r'\s+', 'a b c')
  49. print(L)
  50. # 无论多少个空格都可以正常分割。加入,试试:
  51. L = re.split(r'[\s\,]+', 'a,b, c d')
  52. print(L)
  53. # 再加入;试试:
  54. L = re.split(r'[\s\,\;]+', 'a,b;; c d')
  55. print(L)
  56. # [] 表示范围,这个串至少一个的 \s 空白符 或者,逗号 或者;分号
  57. # 分组
  58. # 除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。
  59. # 用()表示的就是要提取的分组(Group)。比如:
  60. m = re.match(r'^(\d{3})-(\d{3,8})$', '010-123456')
  61. print(m)
  62. print(m.group(0))
  63. print(m.group(1))
  64. print(m.group(2))
  65. # 如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。
  66. # group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。
  67. t = '19:05:30'
  68. m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
  69. for x in range(4):
  70. print(m.group(x))
  71. # 贪婪匹配
  72. # 最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
  73. x = re.match(r'^(\d+)(0*)$', '102300') # 匹配出现在数字后的 0 串
  74. print(x.group(1))
  75. print(x.group(2)) # 这个是空串
  76. # 因为\d+采用贪婪匹配,直接把后面数字全部匹配了,0*只能匹配空字符串了。
  77. # 必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:
  78. x = re.match(r'^(\d+?)(0*)$', '102300') # 加个?就可以让\d+采用非贪婪匹配:
  79. print(x.group(1))
  80. print(x.group(2))
  81. # 编译
  82. '''
  83. 当我们在Python中使用正则表达式时,re模块内部会干两件事情:
  84. 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
  85. 用编译后的正则表达式去匹配字符串。
  86. 如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:
  87. '''
  88. re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
  89. if re.match(re_telephone,'010-12345'):
  90. print('ok')
  91. else:
  92. print('failed')
  93. # 练习
  94. # 请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email:
  95. # someone@gmail.com
  96. # bill.gates@microsoft.com
  97. def is_valid_email(addr):
  98. re_email = r'[0-9a-zA-Z\.]*@[0-9a-zA-Z]*\.com'
  99. if re.match(re_email,addr):
  100. print('ok')
  101. return True
  102. else:
  103. print('failed')
  104. return False
  105. assert is_valid_email('someone@gmail.com')
  106. assert is_valid_email('bill.gates@microsoft.com')
  107. assert not is_valid_email('bob#example.com')
  108. assert not is_valid_email('mr-bob@example.com')
  109. print('测试通过')
  110. # 练习二:
  111. # 可以提取出 Email 的名字
  112. # <Tom Paris> tom@voyager.org => Tom Paris
  113. # bob@example.com => bob
  114. # [<]{0,1} 表示 可以是 一个 < 或者空
  115. def name_of_email(addr):
  116. re_emailname = r'^[<]{0,1}([0-9a-zA-Z\s]*)[>|@]'
  117. test = re.match(re_emailname, addr)
  118. if test:
  119. print('ok')
  120. return test.group(1)
  121. else:
  122. print('failed')
  123. return False
  124. # 测试:
  125. assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
  126. assert name_of_email('tom@voyager.org') == 'tom'
  127. print('测试通过')

python learning Regular Expression.py的更多相关文章

  1. python(4): regular expression正则表达式/re库/爬虫基础

    python 获取网络数据也很方便 抓取 requests 第三方库适合做中小型网络爬虫的开发, 大型的爬虫需要用到 scrapy 框架 解析 BeautifulSoup 库, re 模块 (一) r ...

  2. Python -- 正则表达式 regular expression

    正则表达式(regular expression) 根据其英文翻译,re模块 作用:用来匹配字符串.  在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配. 设计思想:用一 ...

  3. Python正则表达式Regular Expression基本用法

    资料来源:http://blog.csdn.net/whycadi/article/details/2011046   直接从网上资料转载过来,作为自己的参考.这个写的很清楚.先拿来看看. 1.正则表 ...

  4. python learning Exception & Debug.py

    ''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...

  5. [Leetcode][Python][DP]Regular Expression Matching

    # -*- coding: utf8 -*-'''https://oj.leetcode.com/problems/regular-expression-matching/ Implement reg ...

  6. python learning Functional Programming.py

    print(abs(-10)) # 函数可以是变量 f = abs f(-10) def add(x,y,f): return f(x) + f(y) x = -5 y = 6 f = abs # 简 ...

  7. python learning Network Programming.py

    Socket # 用一个 Socke t表示"打开了一个网络连接" # 打开一个 Socket 需要知道目标计算机的IP地址和端口号,再指定协议类型即可. # TCP # 主动发起 ...

  8. Python中的正则表达式regular expression

    1 match = re.search(pat,str)  If the search is successful, search() returns a match object or None o ...

  9. 正则表达式-使用说明Regular Expression How To (Perl, Python, etc)

    notepad++ wiki about regular expression 正则表达式-使用说明Regular Expression How To (Perl, Python, etc) http ...

随机推荐

  1. Django:settings中关于static静态文件目录的设置

    django项目settings中关于静态资源存放位置的设置 主要涉及以下3项:STATIC_URL.STATICFILES_DIR和STATIC_ROOT 1.STATIC_URL 这项是必须配置的 ...

  2. C语言学习记录_2019.02.07

    C99开始,可以用变量来定义数组的大小:例如,利用键盘输入的变量来定义数组大小: 赋值号左边的值叫做左值: 关于数组:编译器和运行环境不会检查数组下标是否越界,无论读还是写. 越界数组可能造成的问题提 ...

  3. 学习sbtenv

    背景 最近由于工作需要, 我总是在不同的scala项目间流动开发. 这就遇到一个很棘手的问题, 这几个项目用的sbt版本不一致, 老项目用的是 sbt 0.13.15, 新项目用的是 sbt 1.0. ...

  4. MySQL配置主主及主从备份

    原文:https://www.cnblogs.com/ahaii/p/6307648.html MySQL主从备份配置实例 场景: 1.主服务器192.168.0.225.从服务器192.168.0. ...

  5. VBA中字符串连接/字符串拼接中“&”和“+”的区别

    VBA中字符串连接/字符串拼接中“&”和“+”的区别   在VBA中用于字符串连接的只有“&”和“+”两种运算符. 1.“&”是强制性连接,就是不管什么都连接. 2.“+”是对 ...

  6. 【转载】Direct3D HLSL介绍(上)

    原文路径:http://www.csharpwin.com/csharpspace/3087.shtml 写过Direct3D程序的朋友们可能还记得,在以往,大家常为如何表现更多真实的材质(如玻璃.金 ...

  7. 33 -jQuery 属性操作,文档操作(未完成)

  8. SQL Server 日期格式和日期操作

    SQL Server发展至今,关于日期的格式的控制方法,有传统的方法,比如CONVERT(),也有比较便利的新方法,比如FORMAT():同样,关于日期的操作函数,也分为传统方法:DATEADD()等 ...

  9. UWP 自然灾害App在刷新数据后卡死的解决方案

    一直以为都在纳闷,为啥我的其他app崩溃次数几乎为0,而单单这个App的崩溃次数简直逆天了,我都不敢相信. 每天都有至少上千次crash...我也是服的 不甘心,趁着这次重构的机会,把代码好好捋了1下 ...

  10. 利用VBS脚本实现Telnet自动连接

    把以下代码保存为*.vbs文件,替换IP.用户名.密码. Dim objShell Set objShell = CreateObject("Wscript.Shell") obj ...