八、正则表达式与JSON

本文详细介绍了正则表达式的各种匹配方式,包括字符集、概括字符集、数量词、边界匹配和组,以及如何使用replace和sub方法进行正则替换。此外,还涵盖了JSON的反序列化、序列化,以及Python中处理JSON数据的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、正则表达式

1.匹配方式

1.1.字符集

字符集——findall方法

re.findall('Python',a)——

使用findall方法,查找字符串中是否包含Python

re.findall('\d',a)——

使用元字符,正则表达式查找数字【0-9】

re.findall('\D',a)——

使用元字符,正则表达式非数字

print('查找中间字符包含c或者f的单词:',re.findall('a[cf]c',s))

print('查找中间字符包含不是c或者f的单词:',re.findall('a[^cf]c',s))

print('查找中间字符包含c-f的单词:',re.findall('a[c-f]c',s))

import math
import re

a = 'C234|C++78|C#|Java5|Python890|Javascript'

# # 查找字符串中是否包含Python
# print(a.index('Python')> -1)
# print('Python' in a)

# 使用findall方法,查找字符串中是否包含Python
r = re.findall('Python',a)
# 使用元字符,正则表达式查找数字【0-9】
d = re.findall('\d',a)
# 使用元字符,正则表达式非数字
e = re.findall('\D',a)
print(r)
print('查找数字:',d)
print('查找非数字:',e)
if len(r) > 0:
    print('字符串中包含Python')
else:
    print('不包含Python')
    
 
s = 'aac,abc,acc,adc,aec,afc,ahc' 
print('查找中间字符包含c或者f的单词:',re.findall('a[cf]c',s))
print('查找中间字符包含不是c或者f的单词:',re.findall('a[^cf]c',s))
print('查找中间字符包含c-f的单词:',re.findall('a[c-f]c',s))

结果

['Python']
查找数字: ['2', '3', '4', '7', '8', '5', '8', '9', '0']
查找非数字: ['C', '|', 'C', '+', '+', '|', 'C', '#', '|', 'J', 'a', 'v', 'a', '|', 'P', 'y', 't', 'h', 'o', 'n', '|', 'J', 'a', 'v', 'a', 's', 'c', 'r', 'i', 'p', 't']
字符串中包含Python
查找中间字符包含c或者f的单词: ['acc', 'afc']
查找中间字符包含不是c或者f的单词: ['aac', 'abc', 'adc', 'aec', 'ahc']
查找中间字符包含c-f的单词: ['acc', 'adc', 'aec', 'afc']

1.2.概括字符集

re.findall('\w',a)——

匹配单词字符,包含0-9、A-Z、a-z、_

re.findall('\W',a)——

匹配非单词字符,包含空格、特殊字符、转义字符

re.findall('\s',a)——

匹配空白字符,转义字符、空格

re.findall('\S',a)——

匹配非空白字符

import re

a = 'python 11\t11java&678p\nh\rp'

# 匹配单词字符,包含0-9、A-Z、a-z、_
print(re.findall('\w',a))

# 匹配非单词字符,包含空格、特殊字符、转义字符
print(re.findall('\W',a))
# 匹配空白字符,转义字符、空格
print(re.findall('\s',a))
# 匹配非空白字符
print(re.findall('\S',a))

结果

['p', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'j', 'a', 'v', 'a', '6', '7', '8', 'p', 'h', 'p']
[' ', '\t', '&', '\n', '\r']
[' ', '\t', '\n', '\r']
['p', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'j', 'a', 'v', 'a', '&', '6', '7', '8', 'p', 'h', 'p']

1.3.数量词

贪婪取值

re.findall('[a-z]{3,6}',s——

取值a-z,位数最小为3,最大为6,贪婪取值

非贪婪取值

re.findall('[a-z]{3,6}?',s)——

取值a-z,位数最小为3,最大为6,加上?为非贪婪取值

re.findall('python*',s)——

*匹配字符前面0次或者无限次数

re.findall('python+',s)——

+匹配字符前面1次或者无限次数

re.findall('python?',s)——

?匹配字符前面0次或者1次

s = 'pytho0python 11\t11java&678p\nh\rppythonn'
# 取值a-z,位数最小为3,最大为6,贪婪取值
print(re.findall('[a-z]{3,6}',s))
# 取值a-z,位数最小为3,最大为6,加上?为非贪婪取值
print(re.findall('[a-z]{3,6}?',s))
# *匹配字符前面0次或者无限次数
print(re.findall('python*',s))
# +匹配字符前面1次或者无限次数
print(re.findall('python+',s))
# ?匹配字符前面0次或者1次
print(re.findall('python?',s))

结果

['pytho', 'python', 'java', 'ppytho']
['pyt', 'pyt', 'hon', 'jav', 'ppy', 'tho']
['pytho', 'python', 'pythonn']
['python', 'pythonn']
['pytho', 'python', 'python']

1.4.边界匹配

边界匹配——findall方法

import re
qq = '2343432444'
# 匹配最少3位、最多8位的数字,$表示从最尾部配置,结果为[43432444]
print(re.findall('\d{3,8}$',qq))
# 匹配最少3位、最多8位的数字,^表示从最前面配置,结果为[23434324]
print(re.findall('^\d{3,8}',qq))
# 匹配最少3位、最多8位的数字,前后都配置,结果为[]
print(re.findall('^\d{3,8}$',qq))

结果

['43432444']
['23434324']
[]

1.5.组

language = 'pythonpythonpythonJSJS67'
# 判断数组中,是否包含3个python
print(re.findall('(python){3}',language))
# 判断数组中,是否包含3个python,2个JS
print(re.findall('(python){3}(JS){2}',language))

结果

['python']
[('python', 'JS')]

1.6.匹配模式参数

language01 = 'PythonC#\nJavaPHP'
# 匹配c#和换行符,re.I模式代表不区分大小写,.代表配置除换行符以外左右的字符。
# re.S模式相当于将.反过来,配置换行符\n
print (re.findall('c#.{1}',language01,re.I | re.S))

结果

['C#\n']

2.正则替换

2.1.使用replace方法替换,将C#替换成GO

lanuage = 'PythonC#JavaC#PHPC#'
# replace方法替换,将C#替换成GO
print(lanuage.replace('C#','GO'))

结果

PythonGOJavaGOPHPGO

2.2.使用sub方法替换,增加替换次数

lanuage = 'PythonC#JavaC#PHPC#'
# replace方法替换,将C#替换成GO
print(lanuage.replace('C#','GO'))
# sub方法替换,将C#替换成GO,2代表替换次数,如写成0,不限制替换次数
print(re.sub('C#','GO',lanuage,2))

结果

PythonGOJavaGOPHPGO
PythonGOJavaGOPHPC#

2.3.使用sub方法,将函数作为参数,替换字符

事例1

import re
lanuage = 'PythonC#JavaC#PHPC#'
# 定义一个函数,return一个替换的字符串
# sub方法调用函数时,ab传入的是一个对象
def replace01(ab):
    print(ab)
    # 通过group方法,拿到匹配的值
    return '!!'+ab.group()+'!!'
# 将函数返回值,作为一个替换后的值
print(re.sub('C#',replace01,lanuage))

结果

<re.Match object; span=(6, 8), match='C#'>
<re.Match object; span=(12, 14), match='C#'>
<re.Match object; span=(17, 19), match='C#'>
Python!!C#!!Java!!C#!!PHP!!C#!!

事例2

s = 'A8C3721D86'
def convert(ac):
    matched = ac.group()
    if int(matched) >= 6:
        return '9'
    else:
        return '0'
r = re.sub('\d',convert,s)
print(r)

结果

A9C0900D99

3.search与match函数匹配

match、search只匹配一次,findall匹配多次

# match、search与findall最大的区别在于 
# match、search只匹配一次,findall匹配多次
s = '683C72D8E67'
# 从第一个字符匹配,如匹配到返回对象,未匹配到返回None
r = re.match('\d',s)
# 查找匹配字符下标位置
print(r.span())
# 从第一个字符匹配,继续往下匹配
rc = re.search('\d',s)
print(rc.group())

结果

(0, 1)
6

4.正则表达式,group分组

a = 'life is short,i use python'
# 使用guoup,取出所有字符串,group参数默认为0
x = re.search('life.*python',a)
print(x.group())
# 使用guoup,取出小括号中分组的字符串
x = re.search('life(.*)python',a)
print(x.group(1))

b = 'life is short,i use python,i love python'
x = re.search('life(.*)python(.*)python',b)
# 使用guoup,取出多个分组的字符串,以元组返回
print(x.group(0,1,2))
# 使用guoup,取出多个分组的字符串,不会取出全部,以元组返回
print(x.groups())

结果

ife is short,i use python
 is short,i use 
('life is short,i use python,i love python', ' is short,i use ', ',i love ')
(' is short,i use ', ',i love ')

二、JSON

1.反序列化

json_str = '[{"name":"陈大方","age":22},{"name":"刘小银","age":20}]'
student = json.loads(json_str)
print(student)

结果

[{'name': '陈大方', 'age': 22}, {'name': '刘小银', 'age': 20}]

2.序列化

student = [{'name':'陈大方','age':22},{'name':'刘小银','age':20}]
# 使用dumps方法,将字符串转换成json,返回str
json_str = json.dumps(student,indent=4,ensure_ascii=False)
print(json_str)

结果

[
    {
        "name": "陈大方",
        "age": 22
    },
    {
        "name": "刘小银",
        "age": 20
    }
]

3.json数据类型可转换为python字符类型

八、正则表达式与JSON_c#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值