python正则表达式二分组匹配

匹配分组 ()表达整体
import re
# (1)分组
print(re.findall('.*?_good','wusir_good alex_good secret男_good'))
print(re.findall('(.*?)_good','wusir_good alex_good secret男_good'))

# (?:) 代表不优先显示分组里面的内容,只是显示正常匹配到的内容
print(re.findall('(?:.*?)_good','wusir_good alex_good secret男_good'))


# (2) | 代表或 , a|b 匹配字符a 或者 匹配字符b . 
strvar = "abceab"
lst = re.findall("a|b",strvar)
print(lst)

# 注意点:把不容易匹配到的内容放到前面,把容易匹配到的内容放到后面
strvar = "abcdeabc234f"
lst = re.findall("abcd|abc",strvar)
print(lst)

# (3) 练习
"""
.  可以匹配任意的字符,除了\n
\. 对.进行转义,表达.这个字符本身.

"""
# 匹配小数 
strvar = "3....  ....4  .3 ...3   1.3  9.89  10"
lst = re.findall(r"\d+\.\d+",strvar)
print(lst)

# 匹配小数和整数 
lst = re.findall(r"\d+\.\d+|\d+",strvar)
print(lst)

# 使用分组改造
'''findall优先显示括号里的内容,需要加上?:取消哦优先显示,按照匹配到的内容显示'''
lst = re.findall(r"\d+(?:\.\d+)?",strvar)
print(lst)


# 匹配135或171的手机号 
strvar = "13566668888 17366669999 17135178392"
lst = re.findall(r"(?:135|171)\d{8}",strvar)
print(lst)

# 优化,只能匹配出一个手机号
strvar = "13566668888"
lst = re.findall(r"^(?:135|171)\d{8}$",strvar)
print(lst)
obj = re.search(r"^(135|171)\d{8}$",strvar)
print(obj)
print(obj.group())
print(obj.groups())


# 匹配www.baidu.com 或者 www.taobao.com
"""
findall : 从左到右,匹配出所有的内容,返回到列表
          问题是,匹配到的字符串和分组的内容不能同时显示;

search  : 从左到右,匹配到一组内容就直接返回,返回的是对象
          优点是,可以让匹配到的内容和分组里的内容同时显示;
          匹配不到内容时,返回的是None
          
obj.group() : 获取匹配到的内容
obj.groups(): 获取分组里面的内容
"""
# findall
strvar = "www.baidu.com  www.taobao.com  www.laowang.com"
lst = re.findall(r"(?:www)\.(?:baidu|taobao)\.(?:com)",strvar)
print(lst)

# search
strvar = "www.baidu.com  www.taobao.com  www.laowang.com"
obj = re.search(r"(www)\.(baidu|taobao)\.(com)",strvar)
print(obj)

# 获取匹配到的内容
print(obj.group())
# 获取分组里面的内容 (推荐)
print(obj.groups())

# 方法二,可以直接通过下标1来获取分组里面的第一个内容;
print(obj.group(1))
print(obj.group(2))
print(obj.group(3))

# search 练习 : 计算"5*6-7/3"结果  匹配 5*6 或者 7/3
strvar =  "5*6-7/3"
# strvar = "www.baidu.com  www.taobao.com  www.laowang.com"
obj = re.search(r"\d+[*/]\d+",strvar)
res1 = obj.group()
print(res1 , type(res1)) # 5*6 <class 'str'>

# 计算结果
a,b = res1.split("*")
res2 = int(a) * int(b)
print(res2)

# 把30替换回原来的字符串中
strvar = strvar.replace(res1,str(res2))
print(strvar)

# 以此类推 ... 

 

上一篇:能自己“跑”的表单控件,思路,雏形,源码。vs2005版本


下一篇:[转]怎样解决Myeclipse内存溢出?