简介:**在自然语言处理中,文本数据通常含有很多无关和无意义字符,比如链接、@符号等,通常叫做噪声,这些噪声会影响我们的nlp任务,所以我们一般会用正则表达式去匹陪字符并删除。
在使用正则表达式的时候需要导入re模块,本次使用re.search匹配字符串。
正则表达式匹配字符串:
在python中,我们使用re.search(regex,string)方法匹配字符串,通过这个方法,我们可以查看string中是否匹配正则表达式regex,如果能够匹配,则返回匹配到的对象,如果不能匹配到则返回None。
1.简单匹配
import re
string = '哈工大的语言技术平台 (LTP)提供了中文分词、依存句法分析、语义角色标注等丰富、精准的自然语言处理技术。NLTK 是一款著名的 Python 自然语言处理工具包。在其收集的大量公开数据集、模型上提供了全面、易用的接口,命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。'
regex = 'LTP'#匹配字符
p = string.split('。')
for line in p:
if re.search(regex,line) is not None:
print(line)
2."."代表匹配任意一个字符
import re
string = '哈工大的语言技术平台 (LTP)提供了中文分词、依存句法分析、语义角色标注等丰富、精准的自然语言处理技术。NLTK 是一款著名的 Python 自然语言处理工具包。在其收集的大量公开数据集、模型上提供了全面、易用的接口,命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。'
regex = 'NLTK.'#匹配NLTK+后面任意1个个字符
p = string.split('。')
for line in p:
if re.search(regex,line) is not None:
print(line)
3.“^”以某个字符串开始
import re
string = '哈工大的语言技术平台 (LTP)提供了中文分词、依存句法分析、语义角色标注等丰富、精准的自然语言处理技术。NLTK 是一款著名的 Python 自然语言处理工具包。在其收集的大量公开数据集、模型上提供了全面、易用的接口,命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。'
regex = '^哈工大'#以哈工大开始的,^以某个字符串开始的
p = string.split('。')
for line in p:
if re.search(regex,line) is not None:
print(line)
4.“$”以某个字符串结束的
import re
string = '哈工大的语言技术平台 (LTP)提供了中文分词、依存句法分析、语义角色标注等丰富、精准的自然语言处理技术。NLTK 是一款著名的 Python 自然语言处理工具包。在其收集的大量公开数据集、模型上提供了全面、易用的接口,命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。'
regex = '功能$'#以功能结束的,$以某个字符串结束的
p = string.split('。')
for line in p:
if re.search(regex,line) is not None:
print(line)
5“[]”中括号匹配多个字符,比如"[我你]们"代表的匹配的字符串是“我们”和“你们”
import re
string = '哈工大的语言技术平台 (LTP)提供了中文分词、词法分析、语义角色标注等丰富、精准的自然语言处理技术。NLTK 是一款著名的 Python 自然语言处理工具包。在其收集的大量公开数据集、模型上提供了全面、易用的接口,命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。我爱自然语言处理。'
regex = '[句词]法'#中括号匹配多个字符
p = string.split('。')
for line in p:
if re.search(regex,line) is not None:
print(line)
6.通过正则表达式匹配年份
"[0-9]“代表的是从0到9的所有数字,”[a-z]"代表的是从a到z的所有小写字母。首先我们定义一个list分配给一个变量strings,匹配的年份是在1000年~2999年之间。
import re
string = ['War of 1812 ','there are 5280 feet to mile','happy new year 2016!']
regex = '[1-2][0-9]{3}'#
for line in string:
if re.search(regex,line) is not None:
print(line)
输出:
War of 1812
happy new year 2016!
匹配字符串中的数字部分,并且是在1000~2999之间,{3}代表的是重复之前的[0-9]三次,是[0-9][0-9][0-9]的简写
7.抽取所有年份
我们使用python中的re模块的另一个方法fiandall来返回匹配带正则表达式的那部分字符串。
import re
string = '2016 is a good year,but 2017 will be better!'
years = re.findall('[2][0-9]{3}',string)
print(years)
输出:['2016', '2017']