• 正则表达式和文本挖掘(Text Mining)


    正则表达式和文本挖掘(Text Mining)

    在进行文本挖掘时,TSQL中的通配符(Wildchar)显得功能不足,这时,使用“CLR+正则表达式”是非常不错的选择,正则表达式看似非常复杂,但,万变不离其宗,熟练掌握正则表达式的元数据,就能掌握正则表达式。

    一,正则表达式的特殊字符

    1,常用元字符

    用以匹配特定的字符(字母,数字,符号):

    • .:匹配除换行符以外的任意字符
    • w:匹配字母或数字或下划线或汉字
    • s:匹配任意的空白符
    • d:匹配数字
    • :匹配单词的开始或结束
    • ^:匹配字符串的开始
    • $:匹配字符串的结束
    • k :引用分组名,例如:k<group_name>,表示引用名字为group_name的分组
    • group_number:group_number是分组的组号,1,2,3等,表示通过组号引用分组

    2,重复字符或分组

    指定前面一个字符或分组重复的次数:

    • *:重复零次或更多次
    • +:重复一次或更多次
    • ?:重复零次或一次
    • {n}:重复n次
    • {n,}:重复n次或更多次
    • {n,m}:重复n到m次

    3,分组,转义,分支,限定符

    这些字符有特定的含义和用途:

    • :用小括号表示一个分组
    • :转义,将特殊字符转移为普通字符,例如:(,表示小括号“(”,小括号不再作为特殊字符
    • | :分支,“或”的关系
    • :一个字符必须匹配列表中任意一个字符,在中括号中指定匹配的字符列表,例如:[aeiou] 一个字符必须aeiou中的任意一个;
    • [^ ] :一个字符不能是排除列表中的任意一个字符,中括号中指定排除的字符列表,例如:[^aeiou] 一个字符不能是aeiou中的任意一个;

    二,分组引用

    分组,是使用小括号指定的一个子表达式;分组引用,是指在表达式中,重复使用子表达式,使正则表达式的写法更简洁。默认情况下,正则表达式为每个分组自动分配一个组号,规则是:组号从1开始,从左向右,组号依次加1(base-1),例如,第一个分组的组号为1,第二个分组的组号为2,以此类推。

    分组定义的三种形式:

    • (exp):自动分配组号,通过分组号引用该分组;
    • (?<name>exp):命名分组,通过分组名引用该分组;
    • (?:exp):该分组只在当前位置匹配文本,在该分组之后,无法引用该分组,该分组没有分组名,也没有分组号;

    1,通过组号引用分组

    在正则表达式前面定义一个分组(exp),在表达式的后面,能够通过组号引用该分组的表达式,引用分组的语法是:group_number;

    例如:(w+)s+1,在该正则表达式中,只存在一个分组(w+),组号是1,在该分组的后面,使用1来引用该分组,将1替换为分组的子表达式,等价于:(w+)s+(w+)。

    2,通过分组名引用分组

    在正则表达式中,能够对分组命名,命名的分组格式:(?<name>exp),分组名是name,通过name来引用该分组的格式是:k<group_name>,通过分组名和组号引用分组,其文本匹配的行为是一样的。

    例如:(?<word>w+)s+1,在该分组的后面中,使用k<word>引用该分组,将k<word>替换为分组的子表达式,等价于:(w+)s+(w+)。

    3,无法引用的分组

    (?:exp):使用这种语法定义的分组,不能引用,只能在当前的位置匹配文本,正则表达式不为该分组自动分配组号。

    三,断言查找

    断言是一个逻辑表达式,只有当表达式为真时,匹配成功。当匹配成功时,返回文本,返回的文本不包含前缀或后缀,即,断言用于查找在特定“文本”之前或之后的文本。断言的四种语法:

    • (?=exp):文本的后面匹配表达式exp,返回exp位置之前的表达式
    • (?<=exp):文本的前面匹配表达式exp,返回exp位置之后的表达式
    • (?!exp):文本的后缀不是exp,返回后缀不是exp的表达式
    • (?<!exp):文本的前缀不是exp,返回前缀不是exp的表达式

    1,后缀匹配

    (?=exp):文本的后面匹配表达式exp,返回exp位置之前的表达式。后缀匹配,和TSQL的 "%ing"类似;

    比如正则表达式:w+(?=ing)

    分析:断言其后缀是ing,并且是单词的结尾(),匹配以ing结尾的单词,但返回单词的前面部分,ing之前的部分;

    例如,查找“I'm reading a book”,它会匹配“reading”,因为该字符后面以ing结尾,该正则表达式返回read,断言返回的文本不包含后缀。

    2,前缀匹配

    (?<=exp):文本的前面匹配表达式exp,返回exp位置之后的表达式。前缀匹配,和TSQL的 "re%"类似;

    比如正则表达式:(?<=re)w+

    分析:单词的打头(),并且单词的前缀是re,匹配以re开头的单词,返回单词的后半部分,re之后的部分;

    例如,查找“I am reading a book”,它会匹配“reading”,因为该字符前面以re打头,该正则表达式返回ading,断言返回的文本不包含前缀。

    3,查找前缀或后缀不是特定文本的文本

    这两个断言查找,跟前面两个相反,作用不大,简单了解一下:

    • (?!exp):文本的后缀不是exp,返回后缀不是exp的表达式
    • (?<!exp):文本的前缀不是exp,返回前缀不是exp的表达式

    比如,正则表达式:w+(?!ing)

    分析:不匹配以ing结尾的单词,查找“I am reading a book”,返回的文本:I,am,a,book

    比如,正则表达式:(?<!re)w+

    分析:不匹配以re打头的单词,查找“I am reading a book”,返回的文本:I,am,a,book

    附:JS正则表达式在线测试:Regex Pal

  • 相关阅读:
    mysql的一些不常用语句
    redis的使用1
    linux理论知识点(用于考试)
    服务器负载均衡数据同步的实现
    解决com.ibatis.sqlmap.client.SqlMapException: There is no statement named in this SqlMap
    cvc-complex-type.2.3: Element 'beans' cannot have character [children]
    Oracle11g服务详细介绍及哪些服务是必须开启的
    Oracle
    oracle 帐号scott被锁定 如何解锁
    记录
  • 原文地址:https://www.cnblogs.com/lizhanqi/p/6025734.html
Copyright © 2020-2023  润新知