Извлечь все строки между разделителями - PullRequest
0 голосов
/ 03 мая 2018

Я кодировал функцию, которая извлекает строки между двумя разделителями. Но в некоторых файлах эти разделители появляются несколько раз, поэтому я хочу извлечь их все. В моей реальной функции он извлекает только то, что встречается, а затем выходит.

Как я могу это исправить?

def extraction_error_CF(file): 

    f=open(file,'r')
    file=f.read()
    f.close()
    start = file.find('Error validating') #1st delimiter
    end = file.find('</SPAN><BR>', start) # 2nd delimiter
    if start!=-1 and end!=-1:             #If these two delimiters are present...
        return(file[start:end])
    else:
        return""

Ответы [ 2 ]

0 голосов
/ 03 мая 2018
import re

def extraction_error_CF(file): # Get error from CF upload 
    f=open(file,'r')
    file=f.read()
    f.close()
    start = re.findall('Error validating(.*)</SPAN><BR>',file)
    if start != -1:
        return start
    else:
        return""

Это то, что я сделал, и это работает хорошо, спасибо всем!

0 голосов
/ 03 мая 2018

Для HTML / XML вы должны полностью использовать надежные модули, такие как BeautifulSoup , но если вам действительно нужно содержимое между двумя разделителями, вы можете использовать ту же функцию, но, добавляя результаты в список (например), вы можете просто распечатать его

def extraction_error_CF(file): 

    f=open(file,'r')
    file=f.read()
    f.close()

    # Patterns
    first = "Error validating"
    second = "</span><br>"

    # For all the matches
    results = []

    # Iterate the whole file
    start = file.find(first)
    end = file.find(second)
    while start != -1 and end != -1:
        # Add everything between the patterns
        # but not including the patterns
        results.append(file[start+len(first):end])
        # Removing the text that already passed
        file = file[end+len(second):]

        start = file.find(first)
        end = file.find(second)

    # Return the content of the list as a string
    if len(results) != 0:
        return "".join(r for r in results)
    else:
        return None

print(extraction_error_CF("test"))
...