CSDN博客:皮乾东
知乎:Htrying
微博:Htring的微博
微信公众号:自然语言处理爱好者(ID:NLP_lover)
正则表达式是一种定义了搜索模式的特征序列,主要是用于字符串的模式匹配,或是字符的匹配。随着计算机的普及以及互联网的发展,大量的信息以电子文档的方式呈现在人们的眼前。NLP通常锁需要处理的语料一部分来自于web王爷的信息抽取,一部分来自于文本格式的文档。Web网页具有很强的开发价值,具有时效强,信息量大,结构稳定,价值高等特点。正则表达式的作用之一是将这些文档内容从非结构化转为结构化,以便后续的文本挖掘。
在python中,我们会使用re模块来实现正则表达式。用到比较多的方法:re.search(regex,string) 这个方法,我们可以检查这个string是否匹配正则表达式regex,如果匹配,则返回一个mathch对象,如果没有就返回None。
测试文本(句子与句子之间用句号隔开):
文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。
代码:
#导入正则表达式需要的包
import re
#测试文档
text_string='文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。'
#定义一个简单的正则表达式
regex='爬虫'
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in p_string:
#search方法是用来查找匹配当前行是否匹配这个regex,返回一个match对象
if re.search(regex, line) is not None:
#如果匹配到了就打印出来
print(line)
结果:
利用一个爬虫爬取到网络中的信息
根据用户的需求,爬虫可以有主题爬虫和通用爬虫
这里使用正则表达式中的保留字符“.”,其含义为:匹配任意一个单字符(换行除外)
例如:
正则表达式 | 可以匹配的例子 | 不能匹配的例子 |
---|---|---|
“a.c” | “abc”,”branch” | “add”,”crash” |
“..t” | “bat” ,”oat” | “it”,”table” |
查找出:”爬+任意一个字”
程序:
import re
#测试文档
text_string='文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。'
#定义一个简单的正则表达式
regex1='爬虫'
regex2='爬.'
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in p_string:
if re.search(regex2, line) is not None:
print("符合regex2:"+line)
结果:
符合regex2:利用一个爬虫爬取到网络中的信息
符合regex2:爬取的策略又广度爬取和深度爬取
符合regex2:根据用户的需求,爬虫可以有主题爬虫和通用爬虫
符号 | 含义 |
---|---|
^ | 匹配开始的字符串 |
$ | 匹配结束的字符串 |
例如:
“^a”:匹配所有a开始的字符串
“a$”:匹配所有a结尾的字符串
案例:查找以”文本”起始的句子:
import re
#测试文档
text_string='文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫爬取到网络中的信息。爬取的策略又广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫。'
#定义一个简单的正则表达式
regex1='爬虫'
regex2='爬.'
regex3="^文本"
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in p_string:
if re.search(regex3, line) is not None:
print("符合regex3:"+line)
结果:
符合regex3:文本最重要的来源无疑是网络
符号 | 含义 |
---|---|
[] | 匹配多个字符 |
如:”[brc]at”代表的是匹配“bat””cat”以及“rat”
案例:提取出以[主要的]或者[紧要的]为起始的新闻标题。文档:
[重要的]今年第七号台风23日登录广东东部沿海地区。
上海发布车库销售监管通知:违规者暂停网签资格。
[紧要的]中国对印连发强硬信息,印度急切需要结束对峙。
代码:
#导入正则表达式需要的包
import re
#测试文档
text_string2=['[重要的]今年第七号台风23日登录广东东部沿海地区','上海发布车库销售监管通知:违规者暂停网签资格','[紧要的]中国对印连发强硬信息,印度急切需要结束对峙']
#定义一个简单的正则表达式
#需要注意的是这里的\是转义字符(在正则表达式中[]式特殊符号)
regex4="^\[[重紧]..\]"
#使用。把测试文档进行分割
p_string=text_string.split("。")
#对分割后的句子进行遍历,找出与正则表达式匹配的句子
for line in text_string2:
if re.search(regex4, line) is not None:
print("符合regex4:"+line)
结果
符合regex4:[重要的]今年第七号台风23日登录广东东部沿海地区
符合regex4:[紧要的]中国对印连发强硬信息,印度急切需要结束对峙
假如你要匹配“\”,那么编程语言表示的正则表达式就需要“\\”(前两个和后两个分别用于在编程语言里转义为反但斜杠,转成两个反但斜杠后再在正则表达式里转义为一个反斜杠),然而在python中使用r"\\"
即可解决。
例如:
import re
if re.search(r"\\","I have one nee\dle") is not None:
print("match")
读者可自行测试。
import re
strings=['War of 1812','There are 5280 feet to a mile','Happy New Year 2016!']
#定义一个存放结果的列表
year_strings=[]
for string in strings:
#这里的正则表达式:年份匹配的范围为1000-2999,{3}重复[0-9]三次
if re.search("[1-2][0-9]{3}", string):
year_strings.append(string)
print(year_strings)
结果:
['War of 1812', 'Happy New Year 2016!']
这是使用re
模块的另一个方法findall()
来返回匹配带正则表达式的那部分字符串。re.findall("[a-z]","abc")
得到的结果:[‘a’,’b’,’c’]。
例如:
import re
year_strings2='2016 was a good year,but 2017 will be better!'
print(re.findall('[2][0-9]{3}', year_strings2))
结果:
['2016', '2017'
以上是简单的正则表达式的介绍,更多可参见文件:链接:https://pan.baidu.com/s/1fC4OGokNjYG51uuaYJlLpQ 密码:ehod