引言

记得几年前在做网页爬虫后的信息抽取时,针对网页源码中隐藏的要提取的信息,比如评论、用户信息等属性信息,直接利用HtmlParser得到。如此做倒是简单,不过利用的是网页的规范的tag标记。其实java中的正则表达式也可以用来实现这一功能。而且对于非tag的一些有规律的系列组合的字符串,正则表达式更能够发挥其卓越的功能。大学时候曾经就接触过正则表达式,不过只是略知皮毛。现在也无心学习,上面的链接网页有一个比较清晰的介绍可供参考。下面只是陈述一下自己在实验过程中利用正则表达式来进行模式匹配以抽取目标信息的尝试及一些简单发现。
 
 
捕获组
 
 
模式中用()来表示捕获组,并且根据圆括号从左到右来编号。一个给定的正则表达式完整部分编号为0,然后()从左到右分别从1开始计数。我们可以得到任意捕获组的内容,下面用一个例子来展示:
 
[java] 
public static void main(String[] args) {  
    // TODO Auto-generated method stub  
    String stmt = "xx[new Date('08/24/2013'), 9.39],[new Date('08/24/2013'), 9.39],";  
    String regex = "\\[(.*?)\\],";  
    Pattern p = Pattern.compile(regex);  
    Matcher m = p.matcher(stmt);  
    System.out.println(m.groupCount());  
    while(m.find()){  
        System.out.println(m.group(0));  
        System.out.println(m.group(1));  
    }  
}  
 
输出结果为:
[plain 
1  
[new Date('08/24/2013'), 9.39],  
new Date('08/24/2013'), 9.39  
[new Date('08/24/2013'), 9.39],  
new Date('08/24/2013'), 9.39  
根据这,我们可以看到整个的表达式为捕获组0,可以匹配输出符合整个表达式模式的串。而()里面的捕获组则得到相应的匹配内容。
 
量词
同样上面的代码,当我们将正则表达式中的?去掉后,输出结果为:
[plain] view plaincopy
1  
[new Date('08/24/2013'), 9.39],[new Date('08/24/2013'), 9.39],  
new Date('08/24/2013'), 9.39],[new Date('08/24/2013'), 9.39  
则发现匹配的是全局部分,也就是所谓的贪婪策略。这就是由于贪婪、勉强和侵占量词的不同。详情可以参考:http://www.java3z.com/cwbwebhome/article/article8/Regex/Java.Regex.Tutorial.html#reg5_3
 
因此,我个人认为如果用来信息抽取可能更多的用的是勉强量词。
 
 
嵌套模式?
假若我们抽取的模式里面包括很多频繁的子模式,是否能够用一个正则表达式来完成呢?比如针对上面的事例,如果将正则表达式修改为
[java] 
String stmt = "xx[[new Date('08/24/2013'), 9.39],[new Date('08/24/2013'), 9.39],];";  
String regex = "\\[(\\[(.*?)\\],)*\\];";  
Pattern p = Pattern.compile(regex);  
Matcher m = p.matcher(stmt);  
System.out.println(m.groupCount());  
while(m.find()){  
    System.out.println(m.group());  
    System.out.println(m.group(0));  
    System.out.println(m.group(1));  
    System.out.println(m.group(2));  
}  
 
目前还没有有效的办法获取最内层捕获组的匹配串,算是一个问题吧?虽然我们可以先用一个正则提取重复部分,然后再利用正则将其分解,一步不行吗?
 
 
Tips
1. .默认并不匹配所有的字符,例如换行空白的就不可以,这时候可以用Pattern p = Pattern.compile(regex,Pattern.DOTALL);来使其匹配所有

Java中正则表达式、模式匹配与信息抽取的更多相关文章

  1. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  2. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  3. java中正则表达式基本用法(转)

    https://www.cnblogs.com/xhj123/p/6032683.html 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符( ...

  4. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  5. Java中正则表达式去除html标签

    Java中正则表达式去除html的标签,主要目的更精确的显示内容,比如前一段时间在做类似于博客中发布文章功能,当编辑器中输入内容后会将样式标签也传入后台并且保存数据库,但是在显示摘要的时候,比如显示正 ...

  6. JAVA中正则表达式常用的四个方法

    JAVA中正则表达式处理字符串的四个常用方法:匹配.分割.替换.截取.其跟字符串的常用函数相似,但是使用正则表达式会更简单.更加简洁.下面是具体的例子: public class TestRegex ...

  7. JAVA中正则表达式学习总结

    一.JAVA中正则表达式相关的类 1. java.util.regex.Pattern 该类用于编译模式,模式可以理解为一个正则表达式,比如:a*b. 用法如下: // 创建模式 Pattern p ...

  8. 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

    简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA ...

  9. K:java中正则表达式的使用说明及其举例

    从Java1.4起,java核心API就引入了java.util.regex程序包来处理正则表达式,并使用该包下的相关类进行字符串的匹配.搜索.提取.分析结构化内容等工作.需要注意的是,正则表达式本身 ...

随机推荐

  1. mysql in 子查询 效率慢 优化(转)

    mysql in 子查询 效率慢 优化(转) 现在的CMS系统.博客系统.BBS等都喜欢使用标签tag作交叉链接,因此我也尝鲜用了下.但用了后发现我想查询某个tag的文章列表时速度很慢,达到5秒之久! ...

  2. VIM中的折叠命令

    参考:http://blog.csdn.net/bruce0532/article/details/8497284 za:在折叠与展开间自由转换 zf:创建折叠 示例:zf 3j    #本行及以下3 ...

  3. Eclipse 输入提示设置

    提升eclipse工具的效率是提升开发效率很重要的一个环节,然而java函数之多你不可能完全记住.eclipse默认打个“.”号后会有相应的提示,然而这略显笨拙.只需要对eclipse进行简单的配置便 ...

  4. Ubuntu 14.04的vim编辑器配置Python开发环境

    #1 $ sudo apt-get install exuberant-ctags vim-scripts $ vim-addons install taglist #2 到:http://www.v ...

  5. @RequestBody, @ResponseBody 注解详解

    简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...

  6. 调试工具GDB详解

    1 简介 2 生成调试信息 3 启动GDB 的方法 4 程序运行上下文 4.1 程序运行参数 4.2 工作目录 4.3 程序的输入输出 5 设置断点 5.1 简单断点 5.2 多文件设置断点 5.3 ...

  7. mysql 源码包 有的版本 可能没有 CMakeCache.txt

    如果没有CMakeCache.txt 文件编译的时候会报错!!找不到CMakeCache.txt

  8. ajax 中文乱码问题 主要是IE浏览器

    解决方案: 提交前采用encodeURI两次编码,注:一定是两次 举例: var taText = $("#txtName").val(); taText = encodeURI( ...

  9. Linux下可以替代windows的软件汇总:(不断完善中)

    http://www.ubuntukylin.com/ukylin/forum.php?mod=viewthread&tid=9530 原则:不求全面,只求实用.主要针对桌面级应用.网购:  ...

  10. hdu 1556 树状数组+点查询

    树状数组 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一 ...