一、正则表达式

在线测试工具 http://tool.chinaz.com/regex/

1.字符组

  1. ​ 在同一个位置可能出现的各种字符组成一个字符组,在正则表达中用[ ]表示
  2. ​ 一个正则就是一条匹配规则,可以规定一次匹配字符的长度,字符组每次匹配一个长度为1的字符,例如:待匹配字符为:2a+ 使用字符组进行匹配时就会进行三次比较
正则 待匹配字段 匹配结果 说明
[0123456789] 5 5 在一个字符组里枚举所有合法的字符,待匹配字符与其中一个相同,即便匹配成功
[0123456789] 56 5和6 匹配个数为2 (见第二条说明)
[0-9] 7 7 用-表示范围,[0-9]和[0123456789]规则相同
[a-z] h h 匹配所有的小写字母
[a-z] 7h h 匹配个数为1
[A-Z] B B 匹配所有的大写字母
[0-9a-dA-D] 1ecD 1、c和D 匹配个数为3 (该正则可以匹配十六进制字符)

2.字符

元字符 待匹配字符 匹配个数 匹配说明
. 1$,a 4 匹配除换行符以外的任意字符
\w _1w@ 3 匹配字母数字下划线
\W _1w@ 1 匹配非字母数字下划线
\s 匹配空白(空格、换行和tab)
\S 匹配非空白
\d 匹配数字
\D 匹配非数字
\n 匹配一个换行符
\t 匹配一个制表符
\b a 2+ 4 匹配字符的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
a|b acfb 2 符合|左右其一即可
(012) 0123 1 匹配括号内的表达式(整体),与[012]区分
[^123] 28291 2 匹配非括号内的所有字符

3.量词

量词 说明
* 重复0次或多次
+ 重复1次或多次
重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次(至少n次)
{n,m} 重复n次到m次

4.转义

正则 待匹配字符 匹配 结果 说明
\n \n False 因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配
\n \n True 转义\之后变成\\,即可匹配
\\\\n \\n True 如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次
r'\n' r'\n' True 在字符串之前加r,让整个字符串不转义

5.贪婪匹配

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

正则 待匹配字符 匹配 结果 说明
<.*> <script>...<script> <script>...<script> 默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> r'\d' <script> <script> 加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串
  1. #贪婪匹配,回溯算法
  2. #\d+8 123456812381281766 匹配结果:12345681238128

二、re模块

python官方文档:https://docs.python.org/zh-cn/3.7/library/re.html?highlight=re#module-re

1.常用函数

1.findall()

​ 返回字符串中所有非重叠匹配项的列表。

  1. import re
  2. ret = re.findall('aba', 'cababa')
  3. print(ret)
  4. #结果:['aba']
  5. ret = re.findall('a', 'cababa')
  6. print(ret)
  7. #结果:['a', 'a', 'a']
2.finditer()函数

返回一个含有所有非重叠匹配项的迭代器

  1. ret = re.finditer('a', '1a2a3ab')
  2. print(ret)
  3. r1=ret.__next__() #r1=ret.__next__().group()
  4. r2=ret.__next__()
  5. print(r1)
  6. print(r2)
  7. #运行结果:
  8. <callable_iterator object at 0x0370E450>
  9. <re.Match object; span=(1, 2), match='a'> # a
  10. <re.Match object; span=(3, 4), match='a'>
  11. StopIteration
  12. #span(起始位置,结束位置)
3.fullmatch()

​ 完全匹配。

  1. ret = re.fullmatch('aba', 'cababa')
  2. print(ret)
  3. #结果:
  4. None
  5. ret = re.fullmatch('aba', 'aba')
  6. print(ret)
  7. #<re.Match object; span=(0, 3), match='aba'>
4.match()

​ 尝试在字符串的开头应用pattern,返回匹配对象(不可迭代),如果没有找到匹配,则为None。

  1. ret = re.match('aba', 'cababa')
  2. print(ret)
  3. #结果:
  4. None
  5. ret = re.match('\d', '12ab3') #相当于re.search('^\d','12ab3')
  6. print(ret)
  7. re1=ret.group(0)
  8. print(re1)
  9. #结果:
  10. <re.Match object; span=(0, 1), match='1'>
  11. 1
5.search()

​ 扫描字符串,寻找与第一个符合匹配的字符串,然后返回匹配对象(不可迭代),如果没有找到匹配,则为None。

  1. ret = re.search('\d', 'c13ab2ab')
  2. print(ret)
  3. #结果:
  4. <re.Match object; span=(1, 4), match='aba'>
  5. <re.Match object; span=(1, 2), match='1'>
  6. 1
  7. #如果没有则ret为None,不可使用ret.group()
  8. #if ret:
  9. ret.group
6.split(self, /, string, maxsplit=0)

​ 根据模式的出现情况拆分源字符串,返回包含结果子字符串的列表。如果捕获括号在pattern中使用,然后是all的文本模式中的组也作为结果的一部分返回列表。如果maxsplit不为零,则最多发生maxsplit拆分,字符串的其余部分作为最后一个元素返回的列表。

  1. ret = re.split('aba', 'cababa1aba')
  2. print(ret)
  3. #结果:
  4. ['c', 'ba1', '']
  5. ret = re.split('aba', 'cababa1aba2')
  6. print(ret)
  7. #结果:
  8. ['c', 'ba1', '2']
  9. ret = re.split('aba', 'cababa1aba2',maxsplit=1)
  10. print(ret)
  11. #结果:
  12. ['c', 'ba12']
  13. ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
  14. print(ret)
  15. # 结果
  16. ['', '', 'cd']
7.sub(pattern, repl, string, count=0, flags=0)

​ 返回通过pattern非重叠替换repl得到的字符串。

  • repl可以是字符串,也可以是可调用的;
  • 如果是字符串,则处理其中的反斜杠转义。
  • 如果它是一个可调用的对象,它传递了Match对象并必须返回要使用的替换字符串
  1. ret = re.sub('\d{2}','+', '2ad232c')
  2. print(ret)
  3. #结果:
  4. 2ad+2c
  5. import random
  6. def fun(s):
  7. i = random.randint(0,len(s))
  8. return s[i]
  9. ret = re.sub('\d{2}',fun('#$%'), '2ad232c')
  10. print(ret)
8.subn(pattern, repl, string, count=0, flags=0)

返回通过pattern非重叠替换repl得到的字符串与替换次数组成的二元组。

  • repl可以是字符串,也可以是可调用的;
  • 如果是字符串,则处理其中的反斜杠转义。
  • 如果它是一个可调用的对象,它传递了Match对象并必须返回要使用的替换字符串
  1. ret = re.subn('\d{2}','+', '2ad232c')
  2. print(ret)
  3. #结果:
  4. ('2ad+2c', 1)
9.compile()

将正则表达式编译成为一个 正则表达式对象,节省编译时间

  1. obj = re.compile('\d{3}')
  2. ret = obj.search('abc123d') #正则表达式对象调用search,参数为待匹配的字符串
  3. print(ret.group())
  4. #结果:
  5. 123
10.template(pattern, flags=0)

​ 编译一个模板模式,返回一个模式对象

11.purge()

清除正则表达式缓存

二、分组的使用

  1. import re
  2. s = '<a>dfjsjgs</a>'
  3. reg = '<a(>)(.+)<'
  4. ret = re.search(reg,s)
  5. print(ret.group()) #或print(ret.group(0)) 默认是0,取所有
  6. print(ret.group(1))
  7. print(ret.group(2))
  8. #结果:
  9. <a>dfjsjgs<
  10. >
  11. dfjsjgs
  12. #findall(),匹配后优先返回括号内的匹配
  13. import re
  14. s = '1.234+4.23'
  15. reg = '\d\.(?:\d+)'
  16. ret = re.findall(reg,s)
  17. print(ret)
  18. #结果:['.234', '.23']
  19. #取消优先 ?:
  20. s = '1.234+4.23'
  21. reg = '\d\.(?:\d+)'
  22. ret = re.findall(reg,s)
  23. print(ret)
  24. #结果:['1.234', '4.23']
  25. #split()
  26. ret = re.split('\d+','abc12de34')
  27. print(ret)
  28. #结果:
  29. ['abc', 'de', '']
  30. ret = re.split('(\d+)','abc12de34')
  31. print(ret)
  32. #结果:
  33. ['abc', '12', 'de', '34', '']
  34. #分组命名
  35. s = '<a>dfjsjgs</a>'
  36. reg = '<(?P<na>\w)>\w+</a>' #(?P<na>\w)分组命名为'na'
  37. ret = re.search(reg,s)
  38. print(ret.group('na'))
  39. #结果:
  40. a
  41. #当要求满足正则并且相同时可以,使用分组命名
  42. s = '<a>dfjsjgs</a>'
  43. reg = '<(?P<na>\w)>\w+</(?P=na\w)>'
  44. ret = re.search(reg,s)
  45. print(ret.group('na'))
  46. #结果:
  47. a
  48. s = '<a>dfjsjgs</a>'
  49. reg = '<(?P<na>\w)>\w+</(?P=na\w)>'
  50. ret = re.search(reg,s)
  51. print(ret.group('na'))
  52. #结果:
  53. a
  54. #分组用法示例,匹配整数
  55. s = '1+2.4*(32-1.5)-11.11'
  56. reg = '\d+\.\d+|\d+'
  57. ret = re.findall(reg,s)
  58. print(ret)
  59. #结果:
  60. ['1', '2.4', '32', '1.5', '11.11']
  61. #可以对上面得到的结果进行遍历判断
  62. s = '1+2.4*(32-1.5)-11.11'
  63. reg = '(\d+\.\d+)|(\d+)'
  64. ret = re.findall(reg,s)
  65. print(ret)
  66. #结果:
  67. [('', '1'), ('2.4', ''), ('', '32'), ('1.5', ''), ('11.11', '')]
  68. #还可以利用分组进行,再次筛选
  69. s = '1+2.4*(32-1.5)-11.11'
  70. reg = '\d+\.\d+|(\d+)'
  71. ret = re.findall(reg,s)
  72. print(ret)
  73. #结果:
  74. ['1', '', '32', '', '']
  75. #使用列表的remove('')

三、flags

  1. Some of the functions in this module takes flags as optional parameters:
  2. A ASCII For string patterns, make \w, \W, \b, \B, \d, \D
  3. match the corresponding ASCII character categories
  4. (rather than the whole Unicode categories, which is the
  5. default).
  6. For bytes patterns, this flag is the only available
  7. behaviour and needn't be specified.
  8. I IGNORECASE Perform case-insensitive matching.
  9. L LOCALE Make \w, \W, \b, \B, dependent on the current locale.
  10. M MULTILINE "^" matches the beginning of lines (after a newline)
  11. as well as the string.
  12. "$" matches the end of lines (before a newline) as well
  13. as the end of the string.
  14. S DOTALL "." matches any character at all, including the newline.
  15. X VERBOSE Ignore whitespace and comments for nicer looking RE's.
  16. U UNICODE For compatibility only. Ignored for string patterns (it
  17. is the default), and forbidden for bytes patterns.
  18. This module also defines an exception 'error'.
  19. re模块中的一些函数含有可选参数flags
  20. A 匹配相应的ASCII字符类别(而不是默认的整个Unicode)
  21. 对于字节模式,A是惟一可用的,不需要指定。
  22. I 执行不区分大小写的匹配
  23. M “^”匹配行开头(换行之后)的字符串。"$"匹配行(换行之后)的结尾字符串
  24. S "."匹配所有,包括换行
  25. #re.S
  26. s = '1Q$\n+'
  27. ret = re.findall('.',s)
  28. print(ret)
  29. 结果:
  30. ['1', 'Q', '$', '+']
  31. s = '1Q$\n+'
  32. ret = re.findall('.',s,re.S)
  33. print(ret)
  34. 结果:
  35. ['1', 'Q', '$', '\n', '+']
  36. #re.M
  37. s = '123\n45 6'
  38. ret = re.findall('^\d+',s)
  39. print(ret)
  40. 结果:
  41. ['123']
  42. s = '123\n45 6'
  43. ret = re.findall('^\d+',s,re.M)
  44. print(ret)
  45. 结果:
  46. ['123', '45']

正则与re模块的更多相关文章

  1. day 18 - 1 正则与 re 模块

    正则表达式 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个 “规则字符串”,这个 “规则字符串” 用来表达对字符串的一种过滤逻辑. 我 ...

  2. Python 正则处理_re模块

    正则表达式 动机 文本处理成为计算机常见工作之一 对文本内容搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 定义 文本的高级匹配模式, 提供搜索, 替换, 本质 ...

  3. day19 正则,re模块

    http://www.cnblogs.com/Eva-J/articles/7228075.html  所有常用模块的用法 正则的规则: 在一个字符组里面枚举合法的所有字符,字符组里面的任意一个字符和 ...

  4. day23 正则,re模块

    一. 简谈正则表达式 元字符 . 除了换行符外任意字符. \w 数字.字母.下划线 \s 空白符 \b 单词的末尾 \d 数字 \n 匹配换行符 \t 匹配制表符 \W 除了数字. 字母 下划线 \D ...

  5. 正则,re模块

    一.正则表达式(精准匹配) 匹配字符串内容的一种规则 二.字符组 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 常见字符组格式如下:[0123456789],[0-9],[ ...

  6. python正则以及collections模块

    正则 一.认识模块  什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...

  7. python 基础之第十二天(re正则,socket模块)

    In [14]: 'hello-wold.tar.gz'.split('.') Out[14]: ['hello-wold', 'tar', 'gz'] In [15]: import re In [ ...

  8. Python正则、re模块

    正则的概念 findall        match        search  方法 元字符的用法和作用 正则表达式概念 正则表达式是对字符串操作的一种逻辑公式,就是对字符串的一种过滤 可以判断是 ...

  9. day 18 - 2 正则与 re 模块练习

    1.爬虫的例子 #爬虫的例子(方法一) import re import urllib,request import urlopen def getPage(url): response = urlo ...

随机推荐

  1. windows7上启动jmeter报错,寻求解决办法?

    背景: 已安装jdk 12,已配置环境变量,点击jmeter.bat 或者进入cmd启动jmter都无法启动 如图: 情况1.在cmd模式下报错 情况2: 打开运行,输入“powershell ise ...

  2. docker 笔记--运行中的容器如何添加端口映射

    解决: iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT_1} -j DNAT --to-destination ${CONTAINERIP}:$ ...

  3. SpringBoot面试题 转(已迁移到java相关知识点)

    ## 什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的 ...

  4. 使用spring profile实现多环境切换

    第一步: applicationContext.xml <!--环境配置开始--> <beans profile="production"> <con ...

  5. RESTful入门

    RESTful入门 1. REST简介 和RPC一样,都是目前比较主流的URL链接风格,也可以说是web服务的一种架构风格.REST全称Representational State Transfer, ...

  6. 雪花算法(DELPHI实现)

    雪花算法(DELPHI实现) 生成ID能够按照时间有序生成. 分布式系统内不会产生重复id(用workerId来做区分). 自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景. GUID:采用无 ...

  7. What is the difference between XSS and CSRF from their execution perspective?

    What is the difference between XSS and CSRF from their execution perspective? https://www.quora.com/ ...

  8. vue+Typescript初级入门

    Typescript 在前端圈已经逐渐普及,Vue 2.5.0 改进了类型声明,使得对 TypeScript 更加友好 不过要想在项目中直接使用 TypeScript 仍然需要对项目进行一些改造 PS ...

  9. Android:导入所需的系统jar包到Android studio

    1. 修改对于的AIDL文件,根据编译信息获知所需的jar包. mmm /frameworks/base/ show commands > log.txt 2>&1 out/tar ...

  10. jpeglib.h jerror.h No such file or directory 以及 SDL/SDL.h: 没有那个文件

    1. error: jpeglib.h jerror.h No such file or directory 没有那个文件或目录 jpeg.cc:19:21:error: jpeglib.h: 没有那 ...