正则表达式

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

  

posted @ 2016-12-23 20:28  200ML  阅读(262)  评论(0编辑  收藏  举报