如何根据输入变量的长度更改函数

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)