如何根据输入变量的长度更改函数
How to change a function based on the length of an input variable
我编写了一个函数,它按索引扫描字符串列表,以查找列表的当前索引和下两个索引中的正则表达式匹配项。如果在三个索引中找到匹配项,则连接列表中的那些元素。
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))
哪个正确returns
['Here', 'be', 'dragons', 'Captain', '23+March+2018', 'and', 'Oct+22+2018']
我想知道,
1) 如何更改 if 语句以包含可变数量的“and”,以便我可以放入 2 个正则表达式或 4 个正则表达式等的模式?
2) 我确信这不是最符合 pythonic 的方法,所以我欢迎其他方法。
您可以使用 "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)
我编写了一个函数,它按索引扫描字符串列表,以查找列表的当前索引和下两个索引中的正则表达式匹配项。如果在三个索引中找到匹配项,则连接列表中的那些元素。
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))
哪个正确returns
['Here', 'be', 'dragons', 'Captain', '23+March+2018', 'and', 'Oct+22+2018']
我想知道, 1) 如何更改 if 语句以包含可变数量的“and”,以便我可以放入 2 个正则表达式或 4 个正则表达式等的模式?
2) 我确信这不是最符合 pythonic 的方法,所以我欢迎其他方法。
您可以使用 "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)