正则表达式在网页课表抓取中的应用
2017-10-21申圣兵
申圣兵
现在流行的校园类App如超级课程表、课程格子等都是以学生熟悉的课程表作为应用的切入点,受到了他们的喜爱。有些应用包含上千所学校的课表信息,这些学校的课表信息千差万别,正则表达式成了一个识别和解析它们的有力工具。
课表的信息来源一般是正方、青果等教务管理系统,它们一般都是以网页形式显示的,其中典型的网页课表源码格式如下:
计算机网络(A)
周二第1,2节{第315周|单周}
冯海林(冯海林)
教1609(多媒体)
它们一般包括课程名、星期、节次、周数、教师、教室等信息,相关类别信息以HTML标记
分隔,很容易使用JSoup等工具解析出来,比较复杂的地方主要是星期、节次等信息,它们往往是连在一起的,不容易分离,并且格式多样,因此,使用正则表达式解析这一部分内容成了课表解析的一个关键。
1 课表节次的一般格式
下面是一些常见的课表节次信息格式:
(1)周二第1,2节{第416周}二,1,2,4,16,null
(2){第210周|3节/周}null,null,null,2,10,3节/周
(3)周二第1,2节{第416周|双周}二,1,2,4,16,双周
(4)周二第1节{第416周}二,1,null,4,16,null
(5)周二第1节{第416周|双周}二,1,null,4,16,双周
这些包括了常见的课表节次格式,如果和以上的格式不符,那么就要自行修改正则表达式。
2 正则表达式的使用方法
现在以Java语言为例介绍正则表达式在高级语言中的使用方法。Java从JDK 1.40版本开始包含了java.util.regex包,这个包中包括了两个类:Pattern(模式类)和Matcher(匹配器类),一个Pattern对象就是一个正则表达式经编译后的表现模式,也就是前边所说的“模式编译器”;一个Matcher对象是一个状态机器,它根据Pattern对象作为匹配模式对字符串展开匹配检查,也就是“模式匹配器”。这里主要使用了Pattern类的compile方法及Matcher类的matches方法。它们的作用如下:
(1)compile(String regex)方法:将指定的正则表达式进行编译。
(2)matches()方法:判断整个字符序列与模式是否匹配。如果连续用Matcher对象检查多个字符串,可以使用reset方法重置匹配器,放弃其所有显式状态信息并将其添加位置设置为零。
课表正则表达式中使用了组,组在正则表达式中是一个非常重要的概念。组是用括号来划分正则表达式的,可以通过编号来引用组。组号从0开始,有几对小括号就表示有几个组,并且组可以嵌套,组号为0的表示整个表达式,组号为1的表示第一个组,依此类推。例如:A((B)C)(D)E正则式中有四组:组0是ABCDE,组1是BC,组2是B;组3是C,组4是D。
3 正则表达式在提取课表信息中的应用
下面我们以提取課程节次信息为例,看看正则表达式的灵活应用。
节次信息的正则表达式可写成:String reg = “周(.)第(\\d{1,2}),(\\d{1,2})节\\{第(\\d{1,2})(\\d{1,2})周\\|((.*周))\\}”;
String splitPattern = “
”;//设置课表分隔标记
String[] temp = sub.split(splitPattern);//将课表信息分离,存在字符串数组中,数组第二个为节次信息
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(temp[1]);
matcher.matches();
最终得到的课表格式如下图如示:
4 结语
现在流行的开发语言比如C#、VB、Java等等都提供了對正则表达式的直接支持,在很多领域得到了应用,由于正则表达式相对比较抽象,不容易理解,要精通它比较困难,但熟悉一些常用操作,对我们的工作还是有很大的帮助的。
参考文献:
[1]胡军伟.正则表达式在Web信息抽取中的应用.北京信息科技大学学报,2011.
[2]张静.正则表达式及其在信息抽取中的应用.电脑知识与技术,2009.
[3]唐惠丽.正则表达式的研究及在Web中的应用.计算机技术与发展,2013.