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

简介:

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

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

1,常用元字符

用以匹配特定的字符(字母,数字,符号),注意字母是区分大小写的:

  • . :匹配除换行符以外的任意字符
  • \w :匹配字母或数字或下划线或汉字
  • \s :匹配任意的空白符
  • \d :匹配数字
  • \b :匹配单词的开始或结束
  • ^ :匹配字符串的开始
  • $ :匹配字符串的结束
  • \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;

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

2,通过分组名引用分组

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

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

3,无法引用的分组

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

三,断言查找

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

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

1,后缀匹配

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

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

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

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

2,前缀匹配

(?<=exp):文本的前面匹配表达式exp,返回exp位置之后的表达式。前缀匹配,和TSQL的 "re%"类似;
比如正则表达式:(?<=\bre)\w+\b

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

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

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

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

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

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

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

3.2 比如,正则表达式:(?<!\bre)\w+\b

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

 

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

推荐阅读:

正则表达式30分钟入门教程

JavaScript RegExp 基础详谈

正则表达式匹配不包含某些字符串的技巧

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: SQL Server







本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/4847209.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Python
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r&#39;string&#39;`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
65 3
|
5月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
51 2
|
5月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
5月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
5月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。
|
5月前
|
Python
Python中re模块的正则表达式
【6月更文挑战第2天】了解Python的re模块,它是处理正则表达式的核心工具。正则表达式用于在文本中查找特定模式。本文讨论了re模块的用法和技巧,包括导入模块、匹配、分组、替换文本、编译正则表达式以及使用预定义字符类、量词、锚点等高级功能。通过实例展示了如何在Python中执行这些操作,帮助提升文本处理能力。掌握这些技巧将使你更有效地利用正则表达式解决字符串处理问题。
49 2
|
5月前
|
Python
Python正则表达式详解:掌握文本匹配的魔法
Python正则表达式详解:掌握文本匹配的魔法
|
5月前
|
Python
python re 正则表达式库的使用
python re 正则表达式库的使用
41 0
|
6月前
|
数据安全/隐私保护 Python
Python进阶---正则表达式
Python进阶---正则表达式
24 2