Заменить часть текста, зная только начало и последнее слово, используя Python - PullRequest
0 голосов
/ 22 февраля 2011

В Python можно вырезать фрагмент текста в документе, когда вы знаете только начальные и конечные слова?

Например, используя билль о правах в качестве образца документа, выполните поиск "Поправка 3 »и удаляйте весь текст до тех пор, пока вы не нажмете« Поправка 4 », фактически не зная или не заботясь о том, какой текст существует между двумя конечными точками.

Причина, по которой я спрашиваю, состоит в том, что я хотел бы использовать этот сценарий Pythonизменить мои другие программы на Python, когда я загружаю их на компьютер клиента, удаляя части кода, которые существуют между комментариями, в которых «# chop-begin» и «# chop-end».Я не хочу, чтобы клиент имел доступ ко всем функциям, не заплатив за лучшую версию кода.

Ответы [ 3 ]

4 голосов
/ 22 февраля 2011

Вы можете использовать модуль Python re.

Я написал этот пример скрипта для удаления фрагментов кода в файле:

import re

# Create regular expression pattern
chop = re.compile('#chop-begin.*?#chop-end', re.DOTALL)

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

# Chop text between #chop-begin and #chop-end
data_chopped = chop.sub('', data)

# Save result
f = open('data', 'w')
f.write(data_chopped)
f.close()
0 голосов
/ 22 февраля 2011

С data.txt

do_something_public()

#chop-begin abcd
get_rid_of_me() #chop-end

#chop-beginner this should stay!

#chop-begin
do_something_private()
#chop-end   The rest of this comment should go too!

but_you_need_me()  #chop-begin  
last_to_go()
#chop-end

следующий код

import re

class Chopper(object):
    def __init__(self, start='\\s*#ch'+'op-begin\\b', end='#ch'+'op-end\\b.*?$'):
        super(Chopper,self).__init__()
        self.re = re.compile('{0}.*?{1}'.format(start,end), flags=re.DOTALL+re.MULTILINE)

    def chop(self, s):
        return self.re.sub('', s)

    def chopFile(self, infname, outfname=None):
        if outfname is None:
            outfname = infname

        with open(infname) as inf:
            data = inf.read()

        with open(outfname, 'w') as outf:
            outf.write(self.chop(data))

ch = Chopper()
ch.chopFile('data.txt')

приводит к data.txt

do_something_public()

#chop-beginner this should stay!

but_you_need_me()
0 голосов
/ 22 февраля 2011

Использование регулярных выражений :

import re

string = re.sub('#chop-begin.*?#chop-end', '', string, flags=re.DOTALL)

.*? будет соответствовать всем между.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...