2014-01-14 4 views
0

У меня несколько сложное имя файла после шаблона s[num][alpha1][alpha2].ext, который я пытаюсь сделать tokenize. Лексиконы, из которых рисуются альфа1 и альфа2, содержатся в двух списках.Сплит строки Python с использованием нескольких разделителей

Я нашел вопрос в https://stackoverflow.com/questions/4998629/python-split-string-with-multiple-delimiters полезным, но это не помогло решить мою проблему.

Между [num] и [alpha1], число предшествует буква (довольно легко регулярное выражение), но между [alpha1] и [alpha2], я расщеплению между двумя словами.

Учитывая имя файла s13LoremIpsum.ext, например, я бы хотел ("s", "13", "Lorem", "Ipsum").

Что было бы лучшим способом достичь этого?

Обратите внимание, что в данном конкретном случае, [alpha2] это единственное письмо, но я заинтересован в решениях для как этот случай и общий случай, когда [alpha1] и [alpha2] слова произвольной длины. Отметим также, что общий случай может ввести двусмысленность, если существует более одного возможного расщепления путем объединения слов из соответствующих лексиконов, например.

alpha1 = ["a", "ab"] 
alpha2 = ["bc", "c"] 
# How will we split? 
splitString == ("a", "bc") 
# --OR-- 
splitString == ("ab", "c") 

Решение этой неоднозначности является вторичной проблемой.

+1

ли alpha1 и альфа2 всегда начинаются с заглавной буквыписьмо? И у них когда-либо есть заглавные буквы внутри? Есть ли когда-нибудь альфа3? – brandonscript

+0

Являются ли 'alpha1' и' alpha2' для соответствия заданным значениям? Ваш другой вопрос подразумевает, что они это сделают. –

+0

В конкретном случае, как альфа1, так и альфа2 являются полностью-капитальными. В общем случае любые слова в любом случае могут быть любым сочетанием капитала и строчной буквы. – Walker

ответ

3
alpha1, alpha2 = ["a", "ab", "Lorem"], ["bc", "c", "Ipsum"] 
import re 
pattern = re.compile("(s)(\\d+)("+"|".join(alpha1) + ")(" + "|".join(alpha2)+")") 
data = "s13LoremIpsum.ext" 
result = [pattern.match(data).group(i) for i in range(1, 5)] 
print result 

Выход

['s', '13', 'Lorem', 'Ipsum'] 

Фактический скомпилированный шаблон можно проверить, как этот

print pattern.pattern 

, который печатает

(s)(\d+)(a|ab|Lorem)(bc|c|Ipsum) 
+0

Удивительный, это выглядит очень хорошо! Я столкнулся с проблемой здесь: Пусть 'alpha1, alpha2 = [" AB "," ABC "], [" C "," D "]'. Теперь давайте 'data =" s13ABCC.ext "'. Мы выводим '['s', '13', 'AB', 'C']'. Обратите внимание, что мы получаем правильный ответ, если alpha1 имеет порядок переключения своих элементов. Как мы можем исправить это поведение? – Walker

+0

@Walker Если нам нужно вручную разделить их, как мы это сделаем? Не следует ли 'CC' быть частью' alpha2'? – thefourtheye

+0

Я предполагаю, что мы обходим неоднозначность, о которой я упоминал в своем сообщении, но в этом примере единственное слово в конце, которое содержится в лексиконе alpha2, будет 'C', поэтому alpha1 затем должна оцениваться как' ABC', а затем просто 'AB'. – Walker

Смежные вопросы