#python #python-3.x #regex #tokenize
#python #python-3.x #регулярное выражение #маркировать
Вопрос:
Имея исходный элемент списка, такой как ["southnorth"]
, я хотел бы добавить пробел на основе списка ["south", "north", "island"]
. Затем список будет изменен с ['southnorth']
на ['south','north']
столько, сколько содержит список, на котором мы основываем токенизацию ['south', 'north']
.
Однако, если есть список ["south", "island"]
, то список ["southnorth"]
должен храниться вместе, как есть.
Я подумал о чем-то, как следует:
list1= ['southnorth']
#list2= ['south','north','island']
list2=['south','island']
str1= " ".join(list1)
str2= " ".join(list2)
Get the alternators to apply regex:
list_compound = sorted(list1 list2, key=len)
alternators = '|'.join(map(re.escape, list_compound)
regex = re.compile(r''.format(alternators)
str1_split = re.sub(r'({})'.format(alternators),r'1 ',str1,0, re.IGNORECASE)
str2_split = re.sub(r'({})'.format(alternators),r'1 ',str2,0, re.IGNORECASE)
Однако вышеприведенное не выполняется, потому что мне нужно обеспечить порядок последовательностей. Например, для декомпозиции ["southnorth"]
мне нужно убедиться, что другой список имеет ["south", "north"]
. В противном случае сохраните его в исходном виде.
Комментарии:
1. Может ли у вас быть более двух частей в объединенной строке?
2. Что, если ваша строка
southwestnorth
? Вы ожидаете, что результат будетsouthwest north
илиsouth westnorth
?3. Я бы сохранил исходную форму
southwestnorth
, потому что единственный способ токенизации — это то, чтоsouth
иnorth
были смежными.
Ответ №1:
Не самое красивое решение и, вероятно, не самое эффективное, но вот тривиальная попытка грубой силы:
def tokenize(word, tokens):
tokenized_word = word
for t in tokens:
tokenized_word = tokenized_word.replace(t, f"{t} ").strip()
for w in tokenized_word.split(" "):
if w.strip() not in tokens:
return word
return tokenized_word
tokens = ["south", "north", "island"]
assert tokenize("south", tokens) == "south"
assert tokenize("southnorth", tokens) == "south north"
assert tokenize("islandsouthnorth", tokens) == "island south north"
assert tokenize("southwestnorth", tokens) == "southwestnorth"