day11_1正则表达式的补充

正则表达式:
group():获取匹配到的所有结果
groups():获取模型中匹配到的分组结果
groupdict():后去模型中匹配到的分组结果
    match()
    search()
    findall()
大概可以分为三大类
无分组:
实例:
origin="hello alex bcd alex lge alex acd 19"
r=re.match("h\w+",origin)
print(r.group())
print(r.groups())
print(r.groupdict())
结果:hello
()
{}

有分组:从获取到的字符串中再获取到所需的字符串(同上实例,只改正则表达式)
groups实例:r=re.match("h(\w+)",origin)
结果:hello 
('ello',)
{}
groupdict实例:r=re.match("(?P<n1>h)(\w+)",origin)   #?P<key>为字典加上key
结果:hello
('h', 'ello')
{'n1': 'h'}
findall()输出的结果(有分组)相当于r.groups(),分组的提取:从左到右,从外到内
finditer()相当于迭代器,可通过for输出
实例:origin="hello alex bcd alex lge alex acd 19w"
r=re.finditer("(a)(\w+)(?P<n1>x)",origin)
print(r)     
for i in r:
    print(i,i.group(),i.groups(),i.groupdict())
结果:<callable_iterator object at 0x000000871B2C4A90>
<_sre.SRE_Match object; span=(6, 10), match='alex'> alex ('a', 'le', 'x') {'n1': 'x'}
<_sre.SRE_Match object; span=(15, 19), match='alex'> alex ('a', 'le', 'x') {'n1': 'x'}
<_sre.SRE_Match object; span=(24, 28), match='alex'> alex ('a', 'le', 'x') {'n1': 'x'}


sub()替换字符串
----------------------------------------------------------------------------------------------------
注意:在单独匹配*时,会在最后额外的进行匹配空值
实例:r=re.findall(r"(\d+a)*","1a2a")
print(r)
结果:['2a', '']
疑问:
实例:r=re.findall(r"(\d+a)*","1a2ad3a")
print(r)
结果:['2a', '', '3a', '']
------------------------------------------------------------------------------------------------------
split():分割
无分组:
实例:origin="hello alex bcd abcd lge acd 19"
n = re.split("a\w+",origin,1)
print(n)
结果:['hello ', ' bcd abcd lge acd 19']
有分组:
实例(同上,只改正则):n = re.split("(a\w+)",origin,1)
结果:['hello ', 'alex', ' bcd abcd lge acd 19'] 
计算器的思路:
实例:origin="1-2 * (60-(2*3)-(2+4))"
n = re.split("\(([^()]+)\)",origin)  #取最里括号内的数据
print(n)
结果:['1-2 * (60-', '2*3', '-', '2+4', ')']




def f(s):
    add = re.compile(r"\d+\.?\d*[+]\d+\.?\d*")
    sub = re.compile("\d+[.]?\d*[-]\d+[.]?\d*")
    mul = re.compile("\d+[.]?\d*[*]\d+[.]?\d*")
    div = re.compile("\d+[.]?\d*[/]\d+[.]?\d*")
    while True:
        if s.find("*"):
                m1=re.split("(\d+[.]?\d*[*]\d+[.]?\d*)",s,1)
                m= int(m1[1][0])*int(m1[1][2])
                s= m1[0]+str(m)+m1[2]
                break


origin = "1-2 * (60-(2*3)-(2+4))"
while True:
    print(origin)
    result = re.split("\(([^()]+)\)",origin,1)
    if len(result)  == 3:
        before = result[0]
        content = result[1]
        after = result[2]                   #等同于 before,content,after = result
        r = f1(content)
        new_str = before + str(r) +after
        origin = new_str
    else:
        print(origin)
        break

猜你喜欢

转载自blog.csdn.net/Tang12060/article/details/80595118