正则表达式是一种定义了搜索模式的特征序列,主要是用于字符串的模式匹配,或是字符的匹配。正则表达式是处理NLP的最基本的手段之一。
正则表达式的作用之一是将文档内容从非结构化转为结构化以便后续的文本挖掘。
正则表达式的另一个作用就是去除“噪声”。在处理大量文本片段的时候有非常多的文字信息与最终输出的文本无关,这些无关的片段称之为“噪声”,比如 URL 或链接、语气助词、标点符号等。
匹配字符串在python中,使用re模块来实现正则表达式。
通过使用re.search(regex,string)这个方法,我们可以检查这个string字符串是否匹配正则表达式regex。如果匹配搭配,这个表达式会返回一个match对象,如果没有匹配到则返回None。
例如:获取包含“爬虫”这个关键字的句子。
import re text_string="文本最重要的来源无疑是网络。我们要把网络中的文本获取形成一个文本数据库。利用一个爬虫抓取到网络中的信息。爬取的策略有广度爬取和深度爬取。根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分" regex='爬虫' p_string= text_string.split('。') # 以句号为分隔符通过split切分 for line in p_string : if re.search( regex,line) is not None: # search方法是用来查找匹配当前行是否匹配这个 regex,返回的是一个 match对象 print(line) # 如果匹配到,打印这行信息
输出:
利用一个爬虫抓取到网络中的信息
根据用户的需求,爬虫可以有主题爬虫和通用爬虫之分
抽取文本中的数字“[0-9]”代表的是从0到9的所有数字,那相对的“[a-z]”代表的是从 a 到 z 的所有小写字母。在自然语言处理中,通过使用正则表达式,抽取文本中的数字,可以提取日期、关键性数据等等。
例如:通过正则表达式匹配年份。
import re year_strings=[] strings=['War of 1812','There are 5280 feet to a mile',' Happy New Year 2016!'] for string in strings: if re.search("[1-2][0-9]{3}", string):#字符串有英文有数字,匹配其中的数字部分,并且是在1000~2999之间,{3}代表的是重复之前的[0-9]三次,是[0-9][0-9][0-9]的简化写法。 year_strings.append(string) print(year_strings)
输出:
[‘War of 1812’, ‘ Happy New Year 2016!’]
例题:
- 抽取文本中的年份:使用正则表达式找出文本中的年份并输出;
- 匹配包含”文本”的句子:找出文本中包含有“文本”的句子,文本以句号作为分割,将匹配的句子输出。
测试输入:
2016 was a good year, but 2017 will be better!
目前有很多的文本数据库。它们都是十分重要的;
预期输出: [‘2016’, ‘2017’]
import re # 任务1:抽取years_string中所有的年份并输出 years_string = input() years=re.findall('[2][0-9]{3}',years_string) print(years) # 任务2:匹配text_string中包含“文本”的句子,并使用print输出,以句号作为分隔 text_string = input() regex = '文本' p_string=text_string.split('。') for line in p_string: if re.search(regex,line) is not None: print(line)
任务1中用了re.findall函数,re.findall(pattern,string,flags=0),findall()函数是逐行匹配的,返回string中所以与pattern相匹配的全部子串,返回形式为数组。