正则表达式
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