引言

记得几年前在做网页爬虫后的信息抽取时,针对网页源码中隐藏的要提取的信息,比如评论、用户信息等属性信息,直接利用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. XmlWriter/XmlReader示例代码

    在Silverlight项目中,如果您想最大程度的减少xap包的大小,仅使用默认System.Xml命名空间下提供的功能来实现“XML序列化/反序列化”,恐怕XmlReader/XmlWriter将成 ...

  2. 每天一个命令day1【diff 命令】(具体实例看下一节)

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  3. 【云计算】开源的Docker Registry WebUI

    kwk/docker-registry-frontend   Code       Issues         9       Pull requests       6       Wiki   ...

  4. Java,Calendar 获得明天凌晨的时间time

    /** * 获得明天凌晨的时间time * * @return */ private long getNextDayZeroTime() { Calendar calendar = Calendar. ...

  5. Android 中的Resource

    Android与ios相比,各种各样Resource算个独特之处.详情请参见官网Resource Types Resource有许多种,常见的有图像资源,布局资源,等等.每一种资源的位置都是固定的,这 ...

  6. openGL纹理映射参数解析

    GLuinttexture[1]; AUX_RGBImageRec *TextureImage[1]; Status=TRUE; // Set The Status To TRUE glGenText ...

  7. JQuery的ajax登录案例

    1.简单版AjaxLogin.html代码: <head> <title></title> <script src="jquery-1.8.3.js ...

  8. 在有EditText控件的AlertDialog对话框中自动弹出输入法

    我们先回顾一下创建AlertDialog的一般步骤. 一 inflate AlertDialog的布局文件   例如,其中dlg就是我们的布局文件.    View layout = LayoutIn ...

  9. Python读写文件乱码问题

    对开发者来说,最恼人的问题之一莫过于读写文件的时候,由于编码千差万别,出现乱码问题.好难快速解决啊... 最近我也遇到了这样的问题,经研究,把大致的解决思路拿出来共享. 1. python中习惯首先声 ...

  10. K-集合 (JXNU第二次周赛1006)set/平衡树

    K-集合 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submissi ...