import re
'''
函数:
findall()
search()
match()
re.compile()
re.split()
p = re.compile(r'\d+')
p.split('one1two2three3four4')
sub()
re.sub("g.t","have",'i get a, i got b , i gut c') 全部替换
re.sub("g.t","have",'i get a, i got b , i gut c'2) 替换2次
re.subn("g.t","have",'i get a, i got b , i gut c'2) 返回总共替换次数
group() 返回被RE匹配的字符串 括号里可写参数位置group(0) group(1)
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配(开始,结束)的位置
'''
''' 普通字符会通过和自身去进去匹配 如‘alxe’就会匹配到‘alxe’ '''
w = re.findall('alex','adfljkdkcdjaalexer')
print(w)
''' 元字符 . 通配符 ^ $ * + ? {} [] | ( ) \ '''
''' . 一个点抵消一个字符 '''
w = re.findall('alex.r','adfljkjjjalexerjjjjjjg')
print(w)
''' ^ 尖角符,匹配元素必须在开头才能匹配 '''
w = re.findall('^alex','alexadfljkjjjerjjjjjjg')
print(w)
''' $符,匹配元素必须在末尾才能匹配 '''
w = re.findall('alex$','adfljkjjjerjalex')
print(w)
''' *,控制前面单个字符,可出现0到N次。如: ale alex alexxxx '''
w = re.findall('alex*','adfljkjjjerjffffalexxxxxxdf')
print(w)
''' +符 控制前面单个字符,可出现1到N次。如: alex alexxxx '''
w = re.findall('alex+','adfljkjjjerjffffalexxxxxxdf')
print(w)
''' ?符 控制前面单个字符,可出现0到1次。如: ale alex '''
w = re.findall('alex?','adfljkjjjerjffffalexxxxxxdf')
print(w)
''' ?符 控制前面单个字符,可选择控制字符出现次数, 如5次 alexxxxxx 也可以控制范围取值 如{3,4} )'''
w = re.findall('alex{5}','adfljkjjjerjffffalexxxxxxdf')
print(w)
w = re.findall('alex{3,4}','adfljkjjjerjffffalexxxxxxdf')
print(w)
''' []符 可取括号内的任意一个值。如果里面有元字符,就会当作普通字符去匹配。如a[.]ex 结果为 a.ex '''
w = re.findall('a[bt]ex','adfljkjjjerjffffabexxxxxxdf')
print(w)
w = re.findall('a[.]ex','adfljkjjjerjffffa.exxxxxxdf')
print(w)
'''这样取 [a-z] 26字母,也可以是数字 [1-9] ! 加尖角符 [^1-9] 就是排除里面范围,取其它'''
w = re.findall('[a-z]','adfljkjjjerjffffa.exxxxxxdf')
print(w)
''' \ 反斜杠后面跟元字符去除特异功能, \反斜杠后面跟普通字符实现特殊功能
\d 匹配任何十进制数,它相当于类 [0-9]
\D 匹配任何非十进制数,它相当于类 [0-9]
\s 匹配任何空白字符;他相当于类 [\t\n\r\f\v]
\S 匹配任何非空白字符;他相当于类 [\t\n\r\f\v]
\w 匹配任何字母数字字符;他相当于类[a-z A-Z 0-9]
\W 匹配任何非字母数字字符;他相当于类[a-z A-Z 0-9]
\b 匹配一个单词边界,也就是指单词和空格的位置
小写 和 大写 匹配相反。
'''
w = re.findall('\d','adfljkj34jjerjfff2falexxxxxxdf')
print(w)
''' 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到
一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。 '''
w = re.search('(ab)*','abadfljkjjjeabarjffffalexxxxxxdfab').group()
print(w)
''' 从前面的描述可以看到 '*', '+' '?' 都是贪婪的,但这也许并不是 '''
w = re.findall('a(\d+)','a235555er4b')
print(w)
''' 从前面的描述可以看到 '*', '+' '?' 都是贪婪的,但这也许并不是 '''
w = re.search('a(\d+?)','a235555er4b').group()
print(w)
w = re.search('a(\d*?)','a235555er4b').group()
print(w)
w = re.search('a(\d+?)','a235555er4b').group()
print(w)
''' 不能执行
w = re.search(r'(alex)(eric)com\2',' alexa23555alex5ericer4b').group()
print(w)
'''
'''
re.I 使匹配对大小写不感冒
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响^ 和 $
re.S 是.匹配包括换行在内的左右字符
re.findall(".","abc\nde")
re.findall(".","abc\nde",re.S)
re.U 根据Unicode字符集解析字符,这个标志影响
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更好
'''
w = re.findall(".","abc\nde")
print(w)
w = re.findall(".","abc\nde",re.S)
print(w)
w = re.search("com","com",re.I).group()
print(w)
p = re.compile(r'\d+')
w = p.findall('one1two2three3four4')
'''' match '''
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
print(matchObj.group())
print(matchObj.group(1))
print(matchObj.group(2))
''' search '''
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
print (searchObj.group())
print (searchObj.group(1))
print (searchObj.group(2))
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
''' sub '''
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print(num)
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print(num)
import re
#
#
#
def func_1(con_1):
r = eval(con_1)
return r
str_1 = '1-2*((60-30+123*99)-(-4*3)/(16-3*2))'
while True:
tt = re.split('\(([^()]+)\)',str_1,1)
print(tt)
if len(tt) == 3:
one = tt[0]
two = tt[1]
thrre = tt[2]
u = func_1(two)
fourr = str(one) + str(u) + str(thrre)
str_1 = fourr
else:
r = func_1(fourr)
print(r)
break