搜索过程
拿出表达式和文本中字符比较,若每个字符可成功匹配,则返回成功,反之返回失败。存在多个匹配项则按照搜索设定返回全部或部分返回。
可以使用python中的re
模块来进行操作功能
import re
a = re.findall("匹配规则","要匹配的字符串")
正则表达式的一些规则
符号 | 作用 |
---|---|
[] | 匹配"[]"中的任意一个字符 |
^ | ^在方框中表示 ”非后面字符开头,在方框外表示以后面字符开头“ |
$ | 以前面字符结尾 |
? | ?表示迁至字符或者无 |
* | *表示前置字符出现0次或者多次 |
+ | +表示前置字符出现1次或者多次 |
. | .表示任意一个字符的通配符 |
.* | .*表示任意字符串 |
| | 表示与前者或者后者匹配 |
() | 用于分组or提高优先级 |
# 匹配字符串
r = 'wood'
ans = re.search(r, "what's woodchuks")
print(ans) #
[]
# 匹配【】中所有字符
r = '[Ww]ood'
ans = re.search(r, "Woodchunks and woodchuks")
print(ans) #
r = '[1-9]'
ans = re.search(r,"is it 012?")
print(ans)#
^
# ^的用法
r = '[^A-Za]' #放在方框内,表示非后面的字符开头
ans = re.search(r, 'ABCDabc')
print(ans)#
?
# ?的用法
r = 'woodchucks?' #?前置的第一个字符或者无,这里只考虑s
ans = re.search(r, 'woodchuck and woodchucks')
print(ans)#
*
# *表示前置字符出现0或多次
r = 'ba*'
text = "bba1 bba@ bbaaa ba?!@3"
ans = re.finditer(r, text)
print(ans)
for i in ans:
print("%s exists between %d and %d" % (i, i.start(), i.end()))
"""
exists between 0 and 1
exists between 1 and 3
exists between 5 and 6
exists between 6 and 8
exists between 10 and 11
exists between 11 and 15
exists between 16 and 18
"""
+
r = 'ba+'
text = "a1 ba@ baaa b?!@3"
ans = re.finditer(r, text)
print(ans)
for i in ans:
print("%s exists between %d and %d" % (i, i.start(), i.end()))
"""
exists between 3 and 5
exists between 7 and 11
"""
^与$在括号外表示首尾
# ^放在【】外,表示以【】内部字符开头
# $表示以前面字符结尾
r = '^[a-z].*e$' #以小写字母开头,e作为结尾
ans = re.search(r, "jam Slade")
print(ans)
优先级由高到低,Counters 类型比 Sequences and anchors 具有更高的优先级,Sequences and anchors 的优先级高于 disjunction。
类型 | 符号 |
---|---|
Parenthesis | () |
Counters | *+? {} |
Sequences and anchors | ^ $ |
Disjunction | | |
匹配选择贪婪策略,例如,/[a-z]*/,0次或者多次,然而,正则表达式
匹配最大字符串
单个字符
character | function |
---|---|
. | 匹配除了换行符的所有字符 |
[] | 匹配[]中所有字符 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白,tab与空格 |
\S | 匹配非空白 |
\w | 单词字符,等价于a-z A-Z 0-9 |
\W | 非单词字符,\w的补集 |
* | 匹配前一个字符出现0次或者多次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符0或1次 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少m次 |
{m,n} | 匹配字符出现m到n次(n>=m) |
^ | 字符串开头 |
$ | 字符串结尾 |
函数 | 作用 |
---|---|
compile (pattern) | 创建模式对象,根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换pattern=re.compile(r’[,./\\?[]\|]’) pattern.split(text) |
match(pattern,string) | 从字符串开始处匹配模式,返回match对象或者None,或者compile对象的.match(“要匹配的字符串”) |
group():result.group() | 提取匹配对象的字符串信息 |
split(pattern,string) | 根据模式匹配项分割字符串 |
sub(pattern,repl,string) | 将字符串中所有pat的匹配项用repl替换,返回新字符串 |
findall(pattern,string) | 列出字符串中模式的所有匹配项 |
字符序列换位标记token序列的过程
词法分析器会对标记分类
词典和序列
N = 标记个数 V = 词表中类型的个数 ∣ V ∣ : 词表的大小 N = 标记个数\\V=词表中类型的个数\\|V|:词表的大小 N=标记个数V=词表中类型的个数∣V∣:词表的大小
文本标记化
分句
使用sent_tokenize
import nltk.tokenize as tk
doc = "How are you? Not bad, what about you? OK."
# 按句拆分,首字母大写,结尾是否有标点
tokens = tk.sent_tokenize(doc)
for i, token in enumerate(tokens):
print("%2" $ (i+1), token)
分词
使用word_tokenize
tokens = tk.word_tokenize(doc)
tokenizer = tk.WordPunctTokenizer()
tokens = tokenizer.tokenize(doc)
for i, token in enumerate(tokens):
print("%2" $ (i+1), token)
词干提取 stemming:am,is,was,been 转化为 be
抽取词的词干或词根形式
leave -> leav
词形还原 lemmatization:plays, played, playing 转化为 play
把一个词汇还原成一般形式,leave => leaf
可以使用nltk.stem下的porter,lancaster,snowball
库·
porter.PorterStemmer().stem(token)
lancaster.LancasterStemmer().stem(token)
snowball.SnowballStemmer().stem(token)
使用nltk.stem
库
ns.Word.NetLemmatizer()
#有lemmatizer.lemmatizer()函数,第一个放tokne,第二个pos-‘v’表示动词,='n'表示名词
import re
f = open(r"path", 'r')
# 非数字字符符号变为空且字符全小写
pattern = re.compile("[^a-zA-Z0-9\n]")
data = re.sub(pattern, "",date).lower()
# 统计单词词频
import nltk
tokens = nltk.word_tokenize(data) #文本标记化
from nltk.corpus import stopwords
tokens = [w for w in tkens if (w not in stopwords.wors('english)] #去停用词
tokens_pos = tk.pos_tag(tokens) #词性标注
from nltk.stem.porter import PorterStemmer
result.append(PorterStemmer().stem(token))#词干提取
import nltk.stem as ns
lemmatizer = ns.WordNetLemmatizer()
result.append(lemmatizer.lemmatize(token, pos=postag))# 词形还原
from collections import Counter
Counter(result).most_common(100)
统计排序
基于规律:词典
基于统计
评价标准:
结巴分词
支持正、逆、双向三种分词模式
import jieba
jieba.cut(text, cut_all = Ture)#全模式
jieba.cut(text, cut_all = False)# 精确模式
# cut_all默认是False
jieba.cut_for_search(text) # 搜索引擎