正则表达式(利用正则表达式网络爬虫)

正则表达式:
字符串匹配的模式:可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

标准字符集合:
\d代表任意一个数字 0~9内任意一个(\D则代表除了数字外的所有字符,相当于取反)
\w任意一个字母或数字或下划线 即AZ,az,0~9,_中任意一个
\s包括空格,制表符,换行符等空白字符
. 小数点可以匹配任意一个字符(除了换行符\n)

自定义字符集合
正则表达式特殊符号被包含到中括号,则失去特殊意义(除了^,-之外)
[5abc]匹配“5”或“a”或“b”或“c”
[^ abc]匹配“a”“b”“c”外任意一个字符
[f-k]匹配“f”~“k”之间任意一个字母
[^f-k0-3]匹配“f”“k”,“0”“3”之外的字符

量词
\d{6}匹配重复6次的数字字符
\d{3,6}匹配至少重复3次,至多6次的数字字符集,默认贪婪模式,尽量匹配6次的
\d{3,6}? 非贪婪模式,优先匹配3次的。
?匹配表达式至少0次或1次,相当于{0,1},与上一行的{}?区别开
+匹配至少出现一次,相当于{1,}
*匹配不出现或出现任意次,相当于{0,}

a\d?b:代表ab,a3b这种ab之间有一个或0个字符的字符集

字符边界:
0宽度匹配位置
^ 与字符串开始的地方匹配
& 与字符串结束的地方匹配
\b 匹配一个单词边界

正则表达式匹配模式:
忽略大小写模式
单行模式:整个文本看作一个字符串
多行模式:每一行看作一个字符串

选择符和分组:

  1. | 竖线表于示 或

  2. 捕获组()使用:
    反向代理:
    ([a-z]{2})\1 :()表示2个字母为一组,\1表现第一个括号内的内容再重复一次(这里只有一个括号) 例如:gogo dodo scsc

‘\1’ 匹配的是 所获取的第1个()匹配的引用。
例如,’(\d)\1’ 匹配两个连续数字字符。如33aa 中的33
‘\2’ 匹配的是 所获取的第2个()匹配的引用。
例如,’(\d)(a)\1’ 匹配第一是数字第二是字符a,第三\1必须匹配第一个一样的数字重复一次,也就是被引用一次。如9a9 被匹配,但9a8不会被匹配,因为第三位的\1必须是9才可以。

预搜索(零宽断言):
(?=exp)断言自身出现位置后面能匹配表达式exp
(?<=exp)断言自身出现位置前面能匹配表达式exp
(?!exp)断言此位置后不能匹配表达式exp
(?<!exp)断言此位置前不能匹配表达式exp
例如:[a-z]+(?=ing):找到了以ing结尾前的字母,比如doing前的do,但ing不匹配,所以是0宽度
[a-z]+(?!\d+):后面不存在数字的字母,例如abc123就不行

一些正则表达式小例子:
(0\d{2,3}-\d{7,9})匹配以0开头+两到三位数字+中间有横杠+七到九位数字的座机号码:010-8889999
(1[35789]\d{9})匹配手机号:1开头+35789中一位数字为第二位+九位任意数字
例如网址URL,QQ号,身份证遇到需要匹配的时候去百度

java内使用正则表达式的一些方法:

public class Demo01 {
    public static void main(String args[]){
        //方法一:匹配查找
        //表达式对象:将正则表达式变为一个对象
        Pattern p=Pattern.compile("\\w+");
        //创建Matcher对象,将正则表达式与待匹配的字符串关联
        Matcher m=p.matcher("abcdefg123");
        boolean yesorno=m.matches();//返回ture
        System.out.println(m.group());//返回该字符串
        boolean yesorno2=m.find();//该方法扫描序列,查找是否于该模式匹配的下一个子序列
        


        //方法二:替换
        m.replaceAll("new");//把匹配的字符串替换,生成新字符串

        //方法三:分割复杂的字符串
        String str="a123b456c789";
        String[] arrs=str.split("\\d+");//以字母来分割字符串
        System.out.println(Arrays.toString(arrs));

    }
}

练习: 利用正则表达式网络爬虫:

/*网络爬虫取链接*/
public class WebSpider {
    public static void main(String[] args) {
        String str = GetStringFromUrl("http://www.163.com", "gbk");
        String regexstr1="<a.+?</a>";//获得文本内超链接的内容,例如<a href="http://sitemap.163.com/">网站地图</a>
        String regexstr2="href=\".+?\"";//引号需要转义字符 //获得文本内超链接的地址,得到href="http://sitemap.163.com/"
        String regexstr3="href=\"(.+?)\"";//加上分组 可以得到http://sitemap.163.com/
      List<String> l=  getAimStr(str,regexstr3);
        for(String s:l){
            System.out.println(s);
        }
    }

        public static List<String > getAimStr(String deststr,String regexstr){//两个参数,一个带检索的文本,一个是正则表达式字符串
          List<String> list=new ArrayList<>();
           Pattern p=Pattern.compile(regexstr);
            Matcher m=p.matcher(deststr);
          while(m.find()){
          //    System.out.println(m.group(1));
              list.add(m.group(1));//若正则表达式内不存在括号则m.group()
          }
          return list;
        }





    public static String GetStringFromUrl(String path,String charsetName){//通过URL爬取网页代码
        StringBuilder info = new StringBuilder();
        try {
            URL url=new URL(path);
            BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream(),charsetName));
            String temp="";
            while((temp=reader.readLine())!=null){
               // System.out.println(temp);
                info.append(temp);
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return info.toString();
    }

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值