手册地址:

https://www.runoob.com/regexp/regexp-metachar.html

在线工具:

http://c.runoob.com/front-end/854


正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配(一个字符串是否与我们所设定这样的字符序列相匹配)。

快速检索文本,实现一些替换文本的操作

  1. 检查一串数字是否电话号码
  2. 检测一个字符串是否是email
  3. 把一个文本里指定的单词替换为另外一个单词

注意:

 能使用底层包里自带的函数解决问题(string,strings,strcnov),首先使用库函数,其次再选择正则表达式(不好理解).

概括单字符集 匹配单字符

  1. import re
  2. # 概括单字符集
  3. a = 'Python 11\t11Java&678p\nh\rp'
  4. # \d 匹配任意数字,等价于 [0-9]。 \D 匹配任意非数字
  5. # \w 匹配数字字母下划线 \W 匹配非数字字母下划线
  6. # \s 匹配任意空白字符,等价于 [\t\n\r\f]。 \S 匹配任意非空字符
  7. # . 匹配换行符之外\n的其它所有字符 - 匹配范围 a-zA-Z0-9
  8. r1 = re.findall('\d',a)
  9. r2 = re.findall('[0-9]',a) #匹配任何数字。类似于 [0123456789]
  10. w1 = re.findall('\D',a)
  11. w2 = re.findall('[^0-9]',a) #匹配除了数字外的字符
  12. print(r1) #['1', '1', '1', '1', '6', '7', '8']
  13. print(r2) #['1', '1', '1', '1', '6', '7', '8']
  14. print(w1) #['P', 'y', 't', 'h', 'o', 'n', ' ', '\t', 'J', 'a', 'v', 'a', '&', 'p', '\n', 'h', '\r', 'p']
  15. print(w2) #['P', 'y', 't', 'h', 'o', 'n', ' ', '\t', 'J', 'a', 'v', 'a', '&', 'p', '\n', 'h', '\r', 'p']
  16. x1 = re.findall('\w',a)
  17. x2 = re.findall('[A-Za-z0-9_]',a) #匹配数字字母下划线
  18. x3 = re.findall('\W',a) #非匹配数字字母下划线
  19. x4 = re.findall('[^A-Za-z0-9_]',a)
  20. print(x1) # ['P', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'J', 'a', 'v', 'a', '6', '7', '8', 'p', 'h', 'p']
  21. print(x2) # ['P', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'J', 'a', 'v', 'a', '6', '7', '8', 'p', 'h', 'p']
  22. print(x3) #[' ', '\t', '&', '\n', '\r']
  23. print(x4) #[' ', '\t', '&', '\n', '\r']
  24. y1 = re.findall('\s',a)
  25. y2 = re.findall('\S',a)
  26. print(y1) #[' ', '\t', '\n', '\r']
  27. print(y2) #['P', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'J', 'a', 'v', 'a', '&', '6', '7', '8', 'p', 'h', 'p']

匹配字符集

  1. import re
  2. a = 'c0c++7Java8c9Python6Javascript'
  3. # 使用python的内置函数
  4. print(a.find('Python')>-1) # 输出 True 如果没有匹配到返回-1,否则返回第一个匹配到的位置
  5. print('Python' in a) # 输出 True
  6. # 使用正规表达式
  7. r=re.findall('Python',a) #['Python']
  8. print(r)
  9. if len(r)>0:
  10. print('ok')
  11. else:
  12. print('no')
  13. # 输出:
  14. # True
  15. # True
  16. # ['Python']
  17. # ok

普通字符与元字符

  • 普通字符 'Python'
  • 元字符 \d

正则表达式 - 元字符

下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:

https://www.runoob.com/regexp/regexp-metachar.html

元字符和普通的字符的混用

a = 'abc , acc , adc , aec , afc , ahc'

  • 匹配字符串中间是cf的
  • 匹配字符串中间 不是cf的
  • 匹配字符串中间字母 是c-f的
  • 普通字符(方括号两边的)a和c是用来定界的,方括号里面的cf元字符是用来匹配的规则,cf是c或f的关系
  1. import re
  2. # 匹配字符串中间是cf的
  3. a = 'abc , acc , adc , aec , afc , ahc'
  4. r = re.findall('a[cf]c',a) #普通字符a和c是用来定界的,cf元字符是用来匹配的
  5. print(r) #['acc', 'afc']
  6. # 匹配字符串中间 不是cf的
  7. r2 = re.findall('a[^cf]c',a)
  8. print(r2) #['abc', 'adc', 'aec', 'ahc']
  9. # 匹配字符串中间字母 是c-f的
  10. r3 = re.findall('a[c-f]c',a)
  11. print(r3) #['acc', 'adc', 'aec', 'afc']

数量词{整数|*|+|?} 匹配多少次

符号 含义
整数 匹配指定长度的字母
* 匹配0次或者无限多次
+ 匹配1次或者无限多次
? 匹配0次或者1次 可以用来过滤单词后面不要的字母,去重

  1. {整数} 匹配指定长度的字母

    1. import re
    2. # 匹配指定长度的字母
    3. a = 'Python 111\t11Java&678php66javascript\nh\rp'
    4. r1 =re.findall('[A-Za-z]{3}',a) # 每次匹配3个长度的字母
    5. print(r1) #['Pyt', 'hon', 'Jav', 'php', 'jav', 'asc', 'rip']
  2. {*} 匹配0次或者无限多次

  3. {+} 匹配1次或者无限多次

  4. {?} 匹配0次或者1次 可以用来过滤单词后面不要的字母,去重

    1. import re
    2. # 数量词
    3. a = 'pytho0python1pythonn2'
    4. # * 匹配0次或者无限多次
    5. r1 = re.findall('python*',a)
    6. print(r1) # 输出 ['pytho', 'python', 'pythonn']
    7. # + 匹配1次或者无限多次
    8. r2 = re.findall('python+',a)
    9. print(r2) # 输出 ['python', 'pythonn']
    10. # ? 匹配0次或者1次
    11. r3 = re.findall('python?',a)
    12. print(r3) # 输出 ['pytho', 'python', 'python']

[0-9]?\.[0-9]+ 小数点前匹配0到1次,\是转义小数点,小数点后匹配1次或者无限多次

?在非贪婪模式和数量词使用时是不同的意义

  1. ?在非贪婪模里是用来转换贪婪与非贪婪模式的
  2. ?在数量词里是表示匹配0次或者1次
  1. a = 'pytho0python1pythonn2'
  2. # ? 在数量词中 匹配0次或者1次
  3. r1 = re.findall('python?',a)
  4. print(r1) # 输出 ['pytho', 'python', 'python']
  5. # ?在`非贪婪模`里
  6. r2 = re.findall('python{1,2}?',a)
  7. print(r2) #['python', 'python']
  8. # `贪婪模`
  9. r2 = re.findall('python{1,2}',a)
  10. print(r2) #['python', 'pythonn']

贪婪模式 匹配指定长度的字符串

  1. import re
  2. # 贪婪模式
  3. a = 'Python 111\t11Java&678php66javascript\nh\rp'
  4. # \d 匹配任意数字,等价于 [0-9]。 \D 匹配任意非数字
  5. # \w 匹配数字字母下划线 \W 匹配非数字字母下划线
  6. # \s 匹配任意空白字符,等价于 [\t\n\r\f]。 \S 匹配任意非空字符
  7. r1 =re.findall('[A-Za-z]{3,10}',a) #贪婪模式 每次匹配3-10个长度的字母
  8. r2 =re.findall('[A-Za-z]{3,}',a) #贪婪模式 每次匹配3到任意个长度的字母
  9. print(r1) #['Python', 'Java', 'php', 'javascript']
  10. print(r1) #['Python', 'Java', 'php', 'javascript']

非贪婪模式 匹配指定长度的字符串

花括号后加上?号表示非贪婪模式

  1. import re
  2. # 非贪婪模式
  3. a = 'Python 111\t11Java&678php66javascript\nh\rp'
  4. # \d 匹配任意数字,等价于 [0-9]。 \D 匹配任意非数字
  5. # \w 匹配数字字母下划线 \W 匹配非数字字母下划线
  6. # \s 匹配任意空白字符,等价于 [\t\n\r\f]。 \S 匹配任意非空字符
  7. r1 =re.findall('[A-Za-z]{3,10}?',a) # ?非贪婪模式 每次匹配3个长度的字母
  8. r2 =re.findall('[A-Za-z]{3,}?',a) # ?非贪婪模式 每次匹配3任意个长度的字母
  9. print(r1) #['Pyt', 'hon', 'Jav', 'php', 'jav', 'asc', 'rip']
  10. print(r1) #['Pyt', 'hon', 'Jav', 'php', 'jav', 'asc', 'rip']

边界匹配

  • ^ 边界的开始
  • $ 边界的结束
  1. # 边界匹配
  2. import re
  3. qq = '100000001'
  4. # 4~8
  5. # ^边界的开始 $边界的结束
  6. r = re.findall('^\d{4,8}$',qq)
  7. print(r) #打印 []
  8. r1 = re.findall('^000',qq)
  9. print(r1) #打印 [] qq不是以0开头的,匹配不到
  10. r2 = re.findall('000$',qq) #qq不是以0结束的,匹配不到
  11. print(r2) #打印 []

组的概念

  1. import re
  2. a = 'PythonPythonPythonPythonPython'
  3. # a里是否有三个Python
  4. ##方法一
  5. r = re.findall('PythonPythonPython',a)
  6. print(r) #打印 ['PythonPythonPython']
  7. ##方法二
  8. r2 = re.findall('(Python){3}',a) #括号表示组,是并且的关系,匹配时可以有多个组如,'(Python){3}(js)',
  9. print(r2) #打印 ['Python']
  10. ##方法三
  11. r3 = re.findall('Python{3}',a) #这种字法只能匹配单个字符(如:a) 不能匹配字符集(如单词:Python)
  12. print(r3) #打印 []

参数匹配

第三个参数,|表示多种模式叠加

  • .点匹配换行符之外\n的其它所有字符
  • re.I 不区分大小写
  • re.S 表示可以让.点号匹配包括\n在内的所有字符
  1. import re
  2. a = 'PythonC#\nJavaPHP'
  3. # 匹配出C#\n
  4. r = re.findall('c#.',a)
  5. print(r) #打印 []
  6. r1 = re.findall('c#.', a , re.I)
  7. print(r1) #打印 []
  8. # .匹配换行符之外\n的其它所有字符
  9. # re.I 不区分大小写
  10. # re.S 表示.号匹配包括\n在内的所有字符
  11. r1 = re.findall('c#.', a , re.I | re.S)
  12. print(r1) #打印 ['C#\n']

替换

  1. 方法一:内置replace函数
  2. 方法二:正则普通替换
  3. 方法三:正则用函数替换
  1. import re
  2. a = 'PythonC#JavaC#PHPC#'
  3. #替换C#为GO
  4. ##方法一:内置replace函数
  5. #字符串是不能改变的,所以要重新给变量赋值
  6. a1 = a.replace('C#','GO',2) #参数 老的 新的 替换的次数
  7. print(a1) #输出 PythonGOJavaGOPHPC#
  8. ##方法二:正则普通替换
  9. a2 = re.sub('C#','GO',a,1) #参数(匹配的规则)老的 新的 原字符串 替换的次数
  10. print(a2) #输出 PythonGOJavaC#PHPC#
  11. ##方法三:正则用函数替换
  12. def couvert(value):
  13. print(value)
  14. # 输出 匹配到了三次,所以输出三次
  15. # <re.Match object; span=(6, 8), match='C#'>
  16. # <re.Match object; span=(12, 14), match='C#'>
  17. # <re.Match object; span=(17, 19), match='C#'>
  18. # 每次匹配时拿到match里的值
  19. matched = value.group()
  20. return '!!' + matched + '!!' # 返回每次处理后的match里的值
  21. a3 = re.sub('C#',couvert,a,3)
  22. print(a3) #输出 Python!!C#!!Java!!C#!!PHP!!C#!!

python 正则表达式与JSON字符串的更多相关文章

  1. Python正则表达式如何进行字符串替换实例

    Python正则表达式如何进行字符串替换实例 Python正则表达式在使用中会经常应用到字符串替换的代码.有很多人都不知道如何解决这个问题,下面的代码就告诉你其实这个问题无比的简单,希望你有所收获. ...

  2. python解析复杂json字符串

    因为项目需要,公司领导对提出了接口测试的要求,因此作为一个测试人员,我第一时间就想到了jmeter这个利器,前面文章也有说明过怎么用jmeter做http协议的接口测试,这里我不再做讲解,此篇主要讲解 ...

  3. python之处理json字符串

    一.如何从文件中读取json字符串 通过json模块可以处理json数据. 1.loads()方法 loads(json_object)将json字符串转换成dict类型. import json # ...

  4. python 获取的json字符串取值

    获取到的json字符串,然后对其取值 {u'result': {u'10.10.10.100': {u'status': u'OK', u'msg': u"{'listen': {'': s ...

  5. python中的 json 模块使用

    (1)python 中生成 json 字符串: import json data = dict(ret=0, msg="Welcome, Login success!") json ...

  6. python 对象和json互相转换

    一.python对json的支持 从python2.6开始,python标准库中添加了对json的支持,操作json时,只需要import json即可. 二.python对象转换成json字符串 在 ...

  7. python中读取json文件报错,TypeError:the Json object must be str, bytes or bytearray,not ‘TextIOWrapper’

    利用python中的json读取json文件时,因为错误使用了相应的方法导致报错:TypeError:the Json object must be str, bytes or bytearray,n ...

  8. Python基础之JSON

    作用 对Python对象进行序列化,便于存储和传输 Python对象与JSON字符串相互转换 Python对象转JSON字符串 import json data = [ { 'a' : 1, 'b' ...

  9. 18 JSON、JSON字符串、反序列化

    JSON教程 : https://www.runoob.com/python/python-json.html 概念 JSON是一种轻量级的数据交换格式,它是一种数据格式! JSON易于阅读.易于解析 ...

随机推荐

  1. DM设备的创建与管理

    DM(Device Mapper)即设备映射(逻辑设备). MD和DM是Linux内核上2种工作机制(实现逻辑设备)不同的模块. Physical Volume(PV): 物理卷         底层 ...

  2. javascript模块化编程规范

    一.javascript模块化编程规范: 二.关于commenjs规范和AMD规范: 根本不同:前者用于服务器端同步加载模块:后者是客户端异步加载模块. 同点:两者都有一个全局函数require(), ...

  3. nginx图片缓存服务器配置实战

     1.图片目录设置: 假定服务器主目录为nginx的默认目录:/usr/local/nginx-0.8.32/html/ 图片存放目录为:/usr/local/nginx-0.8.32/html/SD ...

  4. 关于@webFilter使用@Order无效问题

    前言 在SpringBoot系列文章的<第七章:过滤器.监听器.拦截器>中,小技巧中指出,可使用@Order设置过滤器的执行顺序.由于没有自己求证过,看了相关材料后,想当然的写进了文章中, ...

  5. 解决gradle下载慢的问题

    解决方法要做两部 一 打开用户主目录 linux平台/home/用户名/.gradle windows平台c:\Users\用户名\.gradle macos平台/Users/用户名/.gradle ...

  6. Invoke PowerShell by UiPath

    UiPath能够调用PowerShell ,最近在项目中得到了实践:  需求: 某系统生成的日志文件的名字,时间戳只到分,形如bz20180214_1655.log    这样在如果在1分钟内生成多个 ...

  7. MS Chart 折线图——去除时间中的时、分、秒,按天统计【转】

    MS Chart 折线图——去除时间中的时.分.秒,按天统计   private void Form2_Load(object sender, EventArgs e){            str ...

  8. Vmware 可用的激活码

    4F207-8HJ1M-WZCP8-000N0-92Q6G 0A6Z5-8H1EJ-WZCL1-PK072-23DJG 0F0Q9-8F38L-RZXT9-4U054-ACW5F JA02E-09H4 ...

  9. Java中的while循环——通过示例学习Java编程(10)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=20 在上一个教程中,我们讨论了for循环的用法.在本 ...

  10. 给类型为text的input设置value值却无法修改

    给类型为text的input设置value值后就无法修改了 我的页面显示为如下但是退格却无法改变他的值 原来是缺少onChange事件,没法监听value的改变 所以需要添加 onChange={th ...