Условный пропуск разделения строк - PullRequest
2 голосов
/ 21 мая 2019

Мои данные выглядят как

04/07/16, 12:51 AM - User1: Hi
04/07/16, 8:19 PM - User2: Here’s a link for you
https://www.abcd.com/folder/1SyuIUCa10tM37lT0F8Y3D
04/07/16, 8:29 PM - User2: Thanks

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

data = []
for line in open('/content/drive/My Drive/sample.txt'):
    items = line.rstrip('\r\n').split('\t')   # strip new-line characters and split on column delimiter
    items = [item.strip() for item in items]  # strip extra whitespace off data items
    data.append(items)

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

.

CRLF

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

Ответы [ 4 ]

0 голосов
/ 21 мая 2019

Экспериментальный пост

data = []
for line in open('/content/drive/My Drive/sample.txt'):
    items = [item.strip() for item in line.rstrip('\r\n').split('\t')]
### now it is different from your code ###############################
    if items[0].startswith('http'):
        data[-1].append(items[0])
    else:
        data.append(items)

Возможно, вы хотите лучше контролировать то, что сопоставляется, используя регулярное выражение или что-то еще вместо .startswith(), но это должно помочь вам начать.

0 голосов
/ 21 мая 2019

Один из способов сделать это - просто добавить его к последней записи в списке:

import re
data = []
with open('sample.txt', 'r') as f: # use open so the file closes automatically
    for line in f.readlines():
        if len(data) >= 1 and re.match(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', line):
            data[len(data) - 1] += f" {line.strip()}"
        else:
            data.append(line.strip())
for x in data:
    print(x)

Выход:

04/07/16, 12:51 AM - User1: Hi
04/07/16, 8:19 PM - User2: Here’s a link for you https://www.abcd.com/folder/1SyuIUCa10tM37lT0F8Y3D
04/07/16, 8:29 PM - User2: Thanks

Кредит для: Regex для извлечения URL-адресов ... для регулярного выражения

0 голосов
/ 21 мая 2019

Вам нужно прочитать весь файл сразу:

all_lines = []
for index, line in enumerate(split):
    next_index = index + 1
    if next_index < len(split) and "https" in split[next_index]:
        line += split[next_index]
        del split[next_index]
    all_lines.append(line)
0 голосов
/ 21 мая 2019

Возможно, его можно оптимизировать, но он работает:

data = []                                                                
prev = ''                                                                

with open('C:/Users/kavanaghal/python/sample.txt', 'r', encoding='utf-8') as f:            
    prev = f.readline().strip()                                          

    while True:                                                          
        nxt = f.readline().strip()                                       

        if 'http' in nxt:                                                
            data.append(prev + ": " + nxt)                               
            prev = f.readline()                                          
            continue                                                     

        data.append(prev)                                                
        prev = nxt                                                       

        if not nxt:                                                      
            break                                                        

print(data)                                                              


>> ['04/07/16, 12:51 AM - User1: Hi', 
    '04/07/16, 8:19 PM - User2: Here's a link for you: https://www.abcd.com/folder/1SyuIUCa10tM37lT0F8Y3D', 
    '04/07/16, 8:29 PM - User2: Thanks']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...