当前位置:   article > 正文

python3 正则表达式_valueerror: the device should not be

valueerror: the device should not be ,m) pint(m1) #输出结果如:<re.Match object; span=(0, 1), match='xx'> #span表示匹配的位子,左开右闭区间 #match表示匹配的字符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

match方法中结果的获取:

方法说明
ma.end(group=0, /)返回指定分组的结束位置
ma.start(group=0, /)返回指定分组的开始位置
ma.span(group=0, /)返回指定分组开始与结束位置
ma.group([group1, …])返回字符串或者元组
ma.groups(default=None)返回所有分组信息
groupdict([default=None])根据key获取分组信息
#案例
import re
#正则表达式:匹配内容:数字+a~z+数字,并且进行分组
ma = re.match(r'(\d)\w*(\d)', '1c3')
#匹配结果:'1c3'
print('group():', ma.group())
#获取指定分组:1
print('group(1):', ma.group(1)) 
#获取多个分组:('1', '3')
print('group(1,2):', ma.group(1,2))
#获取所有分组:('1', '3')
print('groups():', ma.groups())
#获取匹配结果索引:(0, 3)
print('span():', ma.span())
#获取指定分组索引:(0, 1)
print('span(1):',ma.span(1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出结果:

group(): 1c3
group(1): 1
group(1,2): ('1', '3')
groups(): ('1', '3')
span(): (0, 3)
span(1): (0, 1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4 re.search方法

该方法用于在字符串中查找,返回match对象或者None

search(pattern, string, flags=0) #参数与match类似。
  • 1

练习:查找第一次出现的数字组成的字串:
在字符串:‘pay:2000 date:2019-03-04’,找到支付价格:2000;

s = 'pay:2000 date:2019-03-04'
#\d+:匹配数字一次或者多次
ma = re.search(r'pay:\d+', s)
print(ma)
  • 1
  • 2
  • 3
  • 4

输出结果:

<re.Match object; span=(0, 8), match='pay:2000'>
  • 1

5 re.findall/finditer方法

re.findall:在字符串中根据正则表达式查找所有匹配,返回查找结果组成列表;
re.finditer与findall功能相同,返回自迭代器;

re.findall(pattern, string, flags=0) 
  • 1

案例:查找字符串中所有数字字符串

import re
s = 'pay:2000 date:2019-03-04'
result = re.findall(r'\d+', s)
print(result)
  • 1
  • 2
  • 3
  • 4

结果为列表:[‘2000’, ‘2019’, ‘03’, ‘04’];

6 re.split方法

该方法将字符串中根据正则表达式查找匹配字符串,然后进行切分,返回字串列表;

re.split(pattern, string, maxsplit=0, flags=0)
#maxsplit:切分次数,默认所有匹配都切分
  • 1
  • 2

练习:

info = 'student:huang,  id:64  age 19'
整理格式:
dinfo = {'student':'huang', 'id':'64', 'age':'19'}
  • 1
  • 2
  • 3

分析:

1>对info使用非字母,数字进行切分;
2>切分后将其整理成字典;

第一步切分:

info = 'system:linux, cpu:x64 memory 8G'
#正则表达式:\W+,匹配1个或多个
s = re.split(r'\W+',info)
print(s)
  • 1
  • 2
  • 3
  • 4

切分结果:[‘system’, ‘linux’, ‘cpu’, ‘x64’, ‘memory’, ‘8G’];
第二步整理字典:

info = 'system:linux, cpu:x64 memory 8G'
s = re.split(r'\W+',info)
dinfo = {}
for index in range(0, len(s), 2):
    dinfo[s[index]] = s[index+1]
print(dinfo)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出结果:{‘system’: ‘linux’, ‘cpu’: ‘x64’, ‘memory’: ‘8G’}

7 re.sub与re.subn

re.sub与re.subn实现的字符串替换功能;

re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)
  • 1
  • 2

re.sub方法根据正则表达式将匹配子串替换成设置值并返回新字符串;参数如下:

主要参数说明
pattern正则表达式
repl替换内容,可以是字符串或者函数
string处理字符串
count替换数量

re.subn与re.sub类似,返回替换数量与新字符串;

练习:

s  = "user:sun,pwd:222222",将密码:222222 替换为:******
  • 1

可以直接使用字符串替换方法:

s.replace('222222', '******')
#结果:'user:sun,pwd:******'
  • 1
  • 2

如果密码为不一样数字如何替换?例如:

s  = "user:sun,pwd:234567"
  • 1

使用re.sub方法:

#将pwd:xxxx替换成******
re.sub(r'pwd:(\d+)', "******", s)
#结果:'user:sun,******'
  • 1
  • 2
  • 3

问题:pwd:去哪里了?如何处理?使用分组。

#pattern使用两个分组
#repl为原字符串,\1代表第一个分组内容,
re.sub(r'(pwd:)(\d+)', r"\1******", s)
  • 1
  • 2
  • 3

替换结果:

'user:sun,pwd:******'
  • 1

大家可以理解下这个题目。

新的问题来了,一组考试成绩:

s = 'math:90, chinese:90, english:50'
  • 1

大于等于60,替换成Pass,否则替换成Faild;推荐使用正则。

我们可以使用函数功能,先来看匹配分数,将其替换为空字符串;

re.sub(r'\d+', '', s)
  • 1

结果:‘math:, chinese:, english:’;
我们将repl替换成函数,函数有一个参数,返回值为空字符串;

def func(arg):
    print(arg)
    return ''
re.sub(r'\d+', func, s)
  • 1
  • 2
  • 3
  • 4

输出结果:

<_sre.SRE_Match object; span=(5, 7), match='90'>
<_sre.SRE_Match object; span=(17, 19), match='90'>
<_sre.SRE_Match object; span=(29, 31), match='50'>
'math:, chinese:, english:'
  • 1
  • 2
  • 3
  • 4

可以看到func中参数为每个匹配的match对象,我们可以获取这个值,并对其处理。

def func(arg):
    #获取分数
    score = int(arg.group())
    #重置返回结果
    if score <60:
        return 'Faild'
    return 'Pass'
re.sub(r'\d+', func, s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出结果:

'math:Pass, chinese:Pass, english:Faild'
  • 1

8 flags标志位:

match,split等方法中都有一个标志位,主要设置值如下:

flag值说明
re.I/re.IGNORECASE匹配不区分大小写
re.L/re.LOCALE\w, \W, \b, \B, \s and \S 依赖于本地
re.M/re.MULTILINE多行匹配,对’^‘与’$'有影响
re.S/re.DOTALL使’.'特殊字符匹配任何字符
re.U/re.UNICODE根据Unicode字符集解析字符。\w, \W, \b, \B, \d, \D, \s和 \S 取决于UNICODE定义的字符属性
re.X/re.VERBOSE此标志允许您编写正则表达式,可添加注释

这些标志位可以结合使用,例如:re.M | re.S。
每个标志使用案例与对比如下:

re.I:匹配忽略大小写

ma = re.match(r'name:\w+', 'Name:sun age:10')
print(ma)
#添加re.I标志
ma = re.match(r'name:\w+', 'Name:sun age:10', re.I)
print(ma)
  • 1
  • 2
  • 3
  • 4
  • 5

结果:

None
<re.Match object; span=(0, 8), match='Name:sun'>
  • 1
  • 2

re.M:多行匹配

找到字符串中与户名

#注意,中间的换行\n
s = 'Name:sun age:10\nname:liu, age:9'
#正则表达式:每行开头开始匹配,默认处理第一行
result = re.findall(r'^name:\w+', s, re.I)
print(result)
  • 1
  • 2
  • 3
  • 4
  • 5

输出结果:[‘Name:sun’];我们想要找到所有用户名?添加re.M,代码如下:

s = 'Name:sun age:10\nname:liu, age:9'
#re.I | re.M,支持设置多个标志位
result = re.findall(r'^name:\w+', s, re.I|re.M)
print(result)
  • 1
  • 2
  • 3
  • 4

结果:[‘Name:sun’, ‘name:liu’]

re.S 修改’.'的行为

字符串:

what = 'I Say:"No!\nNo!"'
  • 1

找出我说的话:“No!\nNo!”
匹配规则,双引号中间字符串,实现:

what = 'I Say:"No!\nNo!"'
ma = re.search(r'\".+\"', what)
print(ma)
  • 1
  • 2
  • 3

输出结果:None;因为’.‘不能匹配’\n’,设置标志re.S,实现:

what = 'I Say:"No!\nNo!"'
ma = re.search(r'\".+\"', what, re.S)
print(ma)
  • 1
  • 2
  • 3

输出结果:

<re.Match object; span=(6, 15), match='"No!\nNo!"'>
  • 1

转载自https://blog.51cto.com/huangyg/2376894

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/113545
推荐阅读
相关标签
  

闽ICP备14008679号