我编写了一个函数,用于按列表的当前和后两个索引中的正则表达式匹配来扫描字符串列表。如果在三个索引中找到匹配项,则列表中的这些元素将被连接。
import re
from nltk.tokenize import MWETokenizer
s = ['Here','be', 'dragons', 'Captain', '23', 'March', '2018', 'and', 'Oct', '22', '2018']
pattern = [r'\d{2}|[a-zA-Z]{3,5}', r'\d{2}|[a-zA-Z]{3,5}', r'\d{4}']
def un_tokenize(pattern, sep, toks):
tokenizer = MWETokenizer([], separator=sep)
for i in list(range(0, len(toks)-len(pattern)+1)):
if bool(re.match(pattern[0], toks[i])) and \
bool(re.match(pattern[1], toks[i+1])) and \
bool(re.match(pattern[2], toks[i+2])):
tup = (toks[i], toks[i+1], toks[i+2])
tokenizer.add_mwe(tup)
return tokenizer.tokenize(toks)
print(un_tokenize(pattern, '+', s))
正确返回
['这里','是','龙','船长','23 + 3月+ 2018','和','10月+ 22 + 2018']
我想知道, 1)如何更改if语句以包含可变数量的'和',以便我可以放入2个正则表达式或4个正则表达式等模式?
2)我确信这不是最狡猾的方式,所以我欢迎其他方法。
答案 0 :(得分:0)
你可以使用“all()”和“map()”来支持任意大小的模式列表:
def un_tokenize(pattern, sep, toks):
tokenizer = MWETokenizer([], separator=sep)
for i in list(range(0, len(toks)-len(pattern)+1)):
if (all(map(re.match, pattern, toks[i:i+len(pattern)]))):
tup = (toks[i:i+len(pattern)])
tokenizer.add_mwe(tup)
return tokenizer.tokenize(toks)