Как изменить функцию в зависимости от длины входной переменной - PullRequest
0 голосов
/ 03 июня 2018

Я написал функцию, которая сканирует список строк по индексу на соответствие регулярному выражению в текущем и следующих двух индексах списка.Если совпадение найдено по трем индексам, эти элементы в списке объединяются.

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))

, что корректно возвращает

['Here', 'be', 'dragons', 'Капитан', '23 + март + 2018 ',' и ',' окт + 22 + 2018 ']

Я хочу знать, 1) Как я могу изменить оператор if, чтобы включитьпеременное число 'и', так что я могу поместить в шаблон 2 регулярных выражения или 4 регулярных выражения и т. д .?

2) Я уверен, что это не самый питонический способ сделать это, поэтому я другие методыДобро пожаловать.

1 Ответ

0 голосов
/ 03 июня 2018

Вы можете использовать «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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...