jieba是一个十分常见的自然语言处理包,功能包括:分词,提取关键词等等,具体看他们的官方页面,下面以jieba中的正则表达式为例子,介绍一些常见的正则公式
例子一
re_userdict = re.compile('^(.+?)([0-9]+)?([a-z]+)?$', re.U)
该正则项是jieba加载自定义函数load_userdict过滤文本使用,下面看看效果
import re
re_userdict = re.compile('^(.+?)([0-9]+)?([a-z]+)?$', re.U)
line = "新灌病毒 是 8 nz"
word, freq, tag = re_userdict.match(line).groups()
结果:
word = '新灌病毒 是'
freq = '8'
tag = 'nz'
解释:^是字符串的开头,
(.+?)其中.是任意符号,除了换行符;+是匹配1个或多个表达式;?是匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式;()是分组;
所以^(.+?)是第一个分组,匹配的是任意符号
([0-9]+)?是第二个分组匹配,只匹配数字,在这个例子中就是词频
([a-z]+)?是第三个分组,只匹配字母,在这个例子就是词性
$是字符串的结尾。
例子二
re_han_default = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._%\-]+)", re.U)
该表达式是jieba用于默认分词jieba.cut第一步文本拆分的表达式
import re
re_han_default = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._%\-]+)", re.U)
line = "dsa@#$正则表达式 dsd"
re_han_default.split(line)
结果:
['', 'dsa', '@', '#', '$', '正则表达式', ' ', 'dsd', '']
解释:\u4E00-\u9FD5是unicode中文编码,a-zA-Z是英文,0-9是数字,然后是几个符号+#等,其中\.就代表符号.,[]+表示匹配1个或多个的表达式。
所以split函数完成的就是对任意文本按照上述汉字/数字/英文/这些符号以外的进行拆分,@不符合条件所以将dsa和#符号拆开,$也不符合条件,所以将#和"正则表达式"拆开,然后是空格,最后是dsd
例子三
re_skip = re.compile("(\r\n|\s)", re.U)
该表达式是用于剔除文本中的空格
import re
re_skip = re.compile("(\r\n|\s)", re.U)
line = "dsa@#$正则表达式 dsd"
re_skip.split(line)
结果:
['dsa@#$正则表达式', ' ', 'dsd']
解释:\r是回车符,\n是换行符,\s是空格,所以re_skip就代表任意非空字符,spli函数完成按照任意非空字符进行拆分
例子四
re_skip_detail = re.compile("([\.0-9]+|[a-zA-Z0-9]+)")
用于匹配字母数字组合和数字
import re
re_skip_detail = re.compile("([\.0-9]+|[a-zA-Z0-9]+)")
line = "1.1 DSA 12DSA da12"
re_skip_detail.split(line)
结果:
['', '1.1', ' ', 'DSA', ' ', '12', '', 'DSA', ' ', 'da12', '']
解释:[\.0-9]+是匹配1个或多个数字、.数字,[a-zA-Z0-9]+是匹配1个或多个字母数字组合,|符号是或,1.1和12符合[\.0-9]+,DSA 和da12符合[a-zA-Z0-9]+
例子五
re_eng1=re.compile('^[a-zA-Z0-9]$', re.U)
用于匹配单个字母或者数字
import re
re_eng1=re.compile('^[a-zA-Z0-9]$', re.U)
line = "s"
re_eng1.match(line)
re_eng1.match("ss")
结果:
第一个公式返回:<re.Match object; span=(0, 1), match='s'>
第二个公式啥也不返回
解释:^匹配字符串的开头,$匹配字符串的结尾,[a-zA-Z0-9]表示匹配任意一组小写字母或者大写字母或者数字,合起来就是从字符串头到尾只匹配一个字母或数字;这个正则表达式和前面的不同就是没有+,如果类似[a-zA-Z0-9]+,就可以匹配一串字母数字组合