用下面的正则表达式:
'(?:大学|学校)?[\w\s]*(?:学|学习)?\s*(\w+\s*专业)'
来提取
'大学规划就学信息安全专业' 中的 '信息安全专业'
为什么最后的到的结果是:‘全专业’
说一下原因
因为默认使用的是贪婪搜索,所以[\w\s]*匹配了从“规划”到“信息安”的所有字段,而因为中间的非捕获组里的“学|学习”后面的问号表示0个或1个,所以在贪婪搜索下直接当做0个跳过。最后捕获组里\w+保证了至少一个字符,同样在前面的贪婪搜索下也只留下了一个字符,所以最终只捕获到了“全专业”。
如果单就这个例子来看,只要把“学|学习”后面的问号去掉就可以捕获正确的文本字段了。
import re
line = '大学规划就学信息安全专业'
a = '(?:大学|学校).?(?:学|学习)(.?专业)'
r = re.findall(a, line)
print(r)