String.split игнорирует содержимое в квадратных скобках с регулярным выражением - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть чат, который выглядит следующим образом:

12-09-18 00:31:40   @966 [playerwithoutspaces] to TEAM: Hello all
12-09-18 00:32:11   @966 [playerswith[inname] to ALL:   Helloall
12-09-18 00:30:15   @966 [player name with spaces] to ALL:  Hello all]

Я пытаюсь получить дату, время, идентификатор, имя, имя пользователя, чат и контент с помощью re.split("""[\s\t](?![^[]*\])""", line, 6) Но это не совсемРабота.Проблема в том, что если content содержит [или], он не разделяет строку должным образом.

Итак, результат:

['12-09-18', '00:30:15', '@966', '[player name with spaces] to ALL:\tHello all]', '']

Когда это должно быть:

['12-09-18', '00:30:15', '@966', '[player name with spaces]', 'to', 'ALL:', '\tHello all]']

Я попытался поигратьсяс соответствием] только определенное количество раз, но это не сработало.

Я забыл упомянуть, что контенту предшествует либо табуляция \ t, либо пробел \ s, поэтому он меняется.

Вот код, который был запрошен:

file = open("chatlog.txt", encoding="ANSI")
...
async def main():
    for line in file.readlines():
        await handle_chatlog_line(line)

async def handle_chatlog_line(line):
    print(re.split("""[\s\t](?![^[]*\])""", line, 6))
    date, time, ingame_client_id, client_name, irrelevant, chat, content = re.split("""[\s\t](?![^[]*\])""", line, 6)

И он вылетает на 3-й строке в чате, из-за неправильного регулярного выражения и, следовательно, разделения не производящего достаточно элементов.

1 Ответ

0 голосов
/ 09 января 2019

Я понял, что расщепление не подходит для такой ситуации, поэтому я использовал re.match:

match = re.match("(\d\d-\d\d-\d\d \d\d:\d\d:\d\d)\s+(@\d+) \[(.+)\] to (TEAM|ALL):\s+(.+)",line)
...