`
沙漠绿树
  • 浏览: 425275 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

正则表达式--捕获最前和最后的组及网页日期时间的抓取

阅读更多
引用
    做信息采集时,难免要用到一些正则表达式了。但是用正则表达式有个贪婪性问题。

    贪婪量词先看整个字符串是不是匹配,如果没有发现匹配,先去掉最后字符串中的最后一个字符,并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复下去直到发现匹配或不剩任何字符串,上面的简单量词都是贪婪量词。
  惰性量词先看字符串中的第一个字母是不是一个匹配,如果不匹配则继续读入下一个字符进行匹配,如果没有则一直匹配下去,与贪婪量词刚好相反,惰性量词用上面的简单量词跟一个?表示。
  支配量词只尝试匹配整个字符串,如果整个字符串不能匹配,不能进一步尝试。

    运用前瞻可以告诉正则表达式运算器向前看一些字符而不移动其位置,包括正向前瞻和负向前瞻,正向前瞻检查的是接下来出现的是不是某个特定字符集,而负向 前瞻则是检查接下来的不应该出现的特定字符集。创建正向前瞻要将模式放在(?=和)之间。创建负向前瞻要将模式放在(?!和)之间。

    下面我做了个例子来解决下这个问题。主要是用 贪婪限定符 ‘?’。


package slcx.com.example;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * 这里是用来检测正则表达式的贪婪性。
 * 
 * @author LoongHua
 *
 */

public class T {

	
	public static void getDefaulst(){
	
		//这里得到默认的那个'XX'及其下一个字符的正则表达式
		String regex = ".*(XX.).*";
		
		String s="..aaXXbbXXccXXddXXee..";
		
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(s);
		if (matcher.matches()) {
			System.out.println("默认情况下的结果:"+matcher.group(1));
		}
	}
	
	public static void getFirst(){
		
		//我们这里得到第一个'XX'及其下一个字符的正则表达式
		String regex = ".*?(XX.).*";

		String s="..aaXXbbXXccXXddXXee..";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(s);
		if (matcher.matches()) {
			System.out.println("得到第一个的结果:"+matcher.group(1));
		}
		
	}

	public static void getLast(){
		String regex = ".*(XX.).*?";
		
		String s="..aaXXbbXXccXXddXXee..";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(s);
		if (matcher.matches()) {
			System.out.println("得到最后一个的结果:"+matcher.group(1));
		}
	}

	/**
	 * 得到网页中的时间问题
	 */
	public static void getDateTime(){
		String html="更新时间:2009-3-23 13:14:31 作    者更新时间:2009-3-23 13:12:54 作    者更新时间:2009-3-16 17:39:54作    者更新时间:2009-3-13 9:07:22作    者更新时间:2009-3-9 13:41:51作    者更新时间:2009-3-5 11:19:36作    者更新时间:2009-3-5 11:16:33作    者更新时间:2009-3-2 11:56:21作    者更新时间:2009-2-26 10:30:19作    者更新时间:2009-2-26 10:28:49更新时间";
		
		// 这个正则表达式能抓取很多类型的日期时间,小到只有日期,大到日期时间(包括秒),这里是默认情况下提取。
		//String regex=".*[^\\d]((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*";
		
		//这里使用了贪婪限定符 ? 提取第一个时间
		String regex=".*?[^\\d]((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*";
		
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(html);
		if (matcher.matches()) {
			System.out.println("得到第一个的时间是:"+matcher.group(1));
		}
		
		//这里使用了贪婪限定符 ? 提取最后一个时间
		regex=".*[^\\d]((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*?";		
		pattern = Pattern.compile(regex);
		matcher = pattern.matcher(html);
		if (matcher.matches()) {
			System.out.println("得到最后一个的时间是:"+matcher.group(1));
		}
	}
	
	/**
	 * 当网页中有多个日期时间时,我们又不要开始结尾的日期时间时
	 * 
	 * 这个时候我们时候就不能完全用正则来实现了(可能可以,只是我不知道而已)
	 * 
	 * @param index 指定要第几个日期时间。
	 */
	public static void getDateTime(int index){
		String regex="((\\d{4}|\\d{2}) ?[/年-] ?\\d{1,2} ?[/月-] ?\\d{1,2} ?[日 ]?( ?\\d{1,2}( ?[点:] ?\\d{1,2}( ?[分:] ?\\d{1,2} ?秒?)?)?)?)[^\\d].*";
		String html="更新时间:2009-3-23 13:14:31 作    者更新时间:2009-3-23 13:12:54 作    者更新时间:2009-3-16 17:39:54作    者更新时间:2009-3-13 9:07:22作    者更新时间:2009-3-9 13:41:51作    者更新时间:2009-3-5 11:19:36作    者更新时间:2009-3-5 11:16:33作    者更新时间:2009-3-2 11:56:21作    者更新时间:2009-2-26 10:30:19作    者更新时间:2009-2-26 10:28:49更新时间";
		Pattern pattern = Pattern.compile(regex);
		
		int count=0;
		while(html.length()>0){
			Matcher matcher = pattern.matcher(html);
			if (matcher.matches()) {
				count++;
				if(count==index){
					System.out.println("得到第 "+index+" 个的时间是:"+matcher.group(1));
				}
				else{
					html=html.substring(matcher.group(1).length());
				}
			}
			else{
				html=html.substring(1);
			}
		}
	}
	
	public static void main(String[] args) {
		getDefaulst();
		getFirst();
		getLast();
		getDateTime(2);
	}
}

//运行结果是:

默认情况下的结果:XXe
得到第一个的结果:XXb
得到最后一个的结果:XXe
得到第一个的时间是:2009-3-23 13:14:31 
得到最后一个的时间是:2009-2-26 10:28:49
得到第 2 个的时间是:2009-3-23 13:12:54 

0
0
分享到:
评论

相关推荐

    扩展微信小程序框架功能:正则表达式

    XRegExp 是一个开源的 JavaScript 库提供一个参数化、可扩展的支持各种浏览器的正则表达式的实现库,支持附加语法、标志以及方法。 XRegExp XRegExp是一个为JS的正则表达式提供扩展功能的库, 调用之后可以弥补原生...

    delphi 批量抓取页面E-MAIL 源码

    用delphi实现的,批量抓取指定页面中的所有e-mail地址,使用了TPerlRegEx插件(正则表达式),希望对你有帮助

    RU-Crime-Alerts:将 RUPD 犯罪警报抓取为 JSON

    使用正则表达式提取时间和位置。 去做 由于这些警报的结构是如此重复,因此从它们中提取结构化数据应该很容易。 我想可能需要一定程度的 NLP 并且不是绝对必要的。 值得注意的是:犯罪,肇事者描述。 位置提取...

    aspnet公共类cs文件.rar

    常用显示日期时间、农历、生肖的日历类(CCalendar.cs,DateTimeHelper.cs) 中国农历年处理类(ChineseCalendar.cs) 正则表达式辅助类(CRegex.cs) CString 的摘要说明。(CString.cs) CText文本内容的类库(CText....

    WHC第三方控件

    2. 常用显示日期时间、农历、生肖的日历类(CCalendar.cs,DateTimeHelper.cs) 3. 中国农历年处理类(ChineseCalendar.cs) 4. 正则表达式辅助类(CRegex.cs) 5. CString 的摘要说明。(CString.cs) 6. CText文本内容...

    DotNet公用类(超多附文档)

    2.常用显示日期时间、农历、生肖的日历类(CCalendar.cs,DateTimeHelper.cs) 3.中国农历年处理类(ChineseCalendar.cs) 4.正则表达式辅助类(CRegex.cs) 5.CString 的摘要说明。(CString.cs) 6.CText文本内容的...

    Coursera_courses_scraper:Scraper 使用 Selenium 模拟浏览器并抓取异步网站

    使用正则表达式从 html 标签中提取复杂的日期字符串。 使用 unittest 测试框架执行以下测试: "test_scrape_data_from_coursera" -- 验证一个虚拟 html 文件的内容是否被 Beautiful Soup 正确捕获。 "test_create...

    用Selenium调用Chrome浏览器实现克制Boss直聘的反爬虫机制来捕获数据.zip

    常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用...

    Git Hound - 使用代码搜索关键字在GitHub上查找公开的密钥-python

    6 星的存储库) 评分系统以强调可信结果,过滤掉常见误报,并优化密集repo 挖掘 Base64 检测和解码 将 GitHound 构建到您的工作流程中的选项,例如自定义正则表达式和仅结果输出模式 用法 echo "\"tillsongalloway....

    javaSE代码实例

    13.5.1 正则表达式的基本语法 259 13.5.2 Pattern类简介 262 13.5.3 Matcher类简介 263 13.5.4 Pattern与Matcher类的综合应用 264 13.6 String类中正则式的应用 266 13.6.1 模式匹配检查 266 13.6.2 ...

Global site tag (gtag.js) - Google Analytics