2015-02-17 3 views
0

У меня есть непредсказуемые строки журнала, которые я пытаюсь разбить.Сплит по разделителю, который приходит первым, Python

Единственное, что я могу предсказать, это то, что первое поле всегда заканчивается либо ., либо :.

Есть ли способ, которым я могу автоматически разделить строку на какой бы ни был разграничитель?

+0

случайный вопрос: они используют. или: для чего-либо другого, кроме разделителей полей ... если бы вы не могли сделать line.replace ('.', ": '). split (": ") – Foon

+0

остальное поле совершенно непредсказуемо, я получаю все – mdandr

+0

достаточно справедливо ... Я просто подумал, что я предлагаю возможный один вкладыш, ответы ниже, очевидно, более сложны, но немного более надежны перед лицом менее предсказуемых данных. – Foon

ответ

1

Посмотрите на индекс символов . и : в строке, используя функцию index().

Вот простая реализация:

def index_default(line, char): 
    """Returns the index of a character in a line, or the length of the string 
    if the character does not appear. 
    """ 
    try: 
     retval = line.index(char) 
    except ValueError: 
     retval = len(line) 
    return retval 

def split_log_line(line): 
    """Splits a line at either a period or a colon, depending on which appears 
    first in the line. 
    """ 
    if index_default(line, ".") < index_default(line, ":"): 
     return line.split(".") 
    else: 
     return line.split(":") 

Я завернул функцию index() в index_default() функции, потому что, если строка не содержит символ, index() бросает ValueError, и я не был уверен, что если каждая строка в вашем журнале будет содержать как период, так и двоеточие.

А затем вот быстрый пример:

mylines = [ 
    "line1.split at the dot", 
    "line2:split at the colon", 
    "line3:a colon preceded. by a dot", 
    "line4-neither a colon nor a dot" 
] 

for line in mylines: 
    print split_log_line(line) 

который возвращает

['line1', 'split at the dot'] 
['line2', 'split at the colon'] 
['line3', 'a colon preceded. by a dot'] 
['line4-neither a colon nor a dot'] 
+0

Ваш ответ кажется отличным решением проблемы. Я собираюсь попробовать это сейчас и дам вам знать, как это работает. – mdandr

+0

Отлично! Прошел мой журнал через функцию, и он отлично работает! ! – mdandr

1

Проверьте индексы обоих символов, затем используйте самый низкий индекс, чтобы разделить строку.

+0

Хорошо, так как '' 'period = mystring.index ('.')' '' '' 'colon = mystring.index (':')' '' '' 'if period mdandr

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