关于分组优先以及 " | " 的细致练习
from django.test import TestCase import re # Create your tests here. ret = re.findall(r"-?d+.d*|-?d+", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) # ['1', '-2', '60', '-40.35', '5', '-4', '3'] ret = re.findall(r"-?d+.d*|(-?d+)", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) # ['1', '-2', '60', '', '5', '-4', '3'] ret = re.findall(r"-?d+|-?d+.d*", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) # ['1', '-2', '60', '-40', '35', '5', '-4', '3'] ret = re.findall(r"-?d+|(-?d+.d*)", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) # ['', '', '', '', '', '', '', ''] ret = re.findall(r"(-?d+.d*)|-?d+", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) # ['', '', '', '-40.35', '', '', '']
"|" 的匹配顺序从左向右 , 而且一旦匹配上了就不会匹配后面的那段正则
"()" 是将被匹配的优先显示, 但是匹配不中的内容会被用 "" 空字符串来表示
多个分组的匹配
先按照整体正则匹配, 然后在提取()中,如果有两个分组(), 则以元组形式显示
import re s = "A B C D" # p1 = re.compile("w+s+w+") # print(p1.findall(s)) # ['A B', 'C D'] p1 = re.compile("(w+)s+w+") print(p1.findall(s)) # 第一步 ['A B','C D'] # ['(w+)s+w+','(w+)s+w+'] # 第二步 ['A','C'] # ['(w+)', '(w+)'] p1 = re.compile("(w+)s+(w+)") print(p1.findall(s)) # 第一步 ['A B','C D'] # ['(w+)s+(w+)','(w+)s+(w+)']
# 第二步 [('A','B'),('C','D')] # [('(w+)','(w+)'),('(w+)','(w+)')]
进阶的练习