How to read input until next occurrence in Python

Viewed 134

So the problems is that given the below input, I would like to separate every urls (that start with either [URL or [LINK or [WEBSITE) and the text. I would like to put every URLs in order into a list and every text into a text.

I also would like to combine every text into one line. So that every link matches with its corresponding text. Below is an example.

[URL - https://url1.com]
news_line1 word
news_line2 word word
news_line3 word word word

[LINK - https://url2.com]
headline_line1 letter
headline_line2 letter letter
headline_line3 letter letter letter

[WEBSITE - https://url3.com]
date_line1 sentence
date_line2 sentence sentence
date_line3 sentence sentence sentence

output would be Links:

[URL - https://url1.com]
[LINK - https://url2.com]
[WEBSITE - https://url3.com]

and Text:

news_line1 word news_line2 word word news_line3 word word word
headline_line1 letter headline_line2 letter letter headline_line3 letter letter letter
date_line1 sentence date_line2 sentence sentence date_line3 sentence sentence sentence

The current code I have is

import sys

inFile = sys.argv[1]

with open(inFile) as f:
    content = f.readlines()

content = [x.strip() for x in content]
url_links = []
sentences = []

for entry in content:
    sentence = ""
    if entry.startswith(("[news_text", "[headline", "[date")):
        url_links.append(entry)

    else:
        sentence = sentence + entry

    sentences.append(sentence)

for sentence in sentences:
    print(sentence)

And the current output I have is


news_line1 word
news_line2 word word
news_line3 word word word


headline_line1 letter
headline_line2 letter letter
headline_line3 letter letter letter


date_line1 sentence
date_line2 sentence sentence
date_line3 sentence sentence sentence

How can I tweak it such that it give me the correct output?

2 Answers

If you don't want to add unnecessary empty lines to your output you should add this to your loop

if not entry:
    continue

To get output you want, you can utilize string's join method:

result = ''.join(sentences)
print(result)

To split your text into blocks, let's add a boolean variable showing if there was a block end (block ends when new url_link starts being processed).

previous_block_end = False
for entry in content:
    if not entry:
        continue

    sentence = ""
    if entry.startswith(("[URL", "[LINK", "[WEBSITE")):
        previous_block_end = True
        url_links.append(entry)
    else:
        sentence = sentence + entry
        if previous_block_end and len(url_links) > 1:
            sentence = '\n' + sentence
        if not previous_block_end:
            sentence = ' ' + sentence
        previous_block_end = False

    sentences.append(sentence)

result = ''.join(sentences)
print(result)

Use list to store sentence elements, remember startswith() is case sensitive, relevant part of code after modifications below:

url_links = []
sentences = []
sentence = []
for entry in s.split('\n'):    # s holds your string
    entry.strip()
    if entry.startswith(("[URL", "[LINK", "[WEBSITE")):
        url_links.append(entry)
        if sentence:    # add only not empty list
            sentences.append(' '.join(sentence))
        sentence = [] 
    else:
        if entry: sentence.append(entry)
else:   # this else belongs to for
    if sentence: sentences.append(' '.join(sentence))


for sentence in sentences:
    print(sentence)
Related