2017-02-11 12 views
0

Я ищу модуль python или какой-то существующий код python, который можно использовать для обертывания текста, который использует префикс строки «>» для указания цитируемого текста (см. Ниже пример).python: модуль для обертывания текста, цитируемый по соглашениям электронной почты?

Я знаю, что могу использовать python textwrap модуль для обертывания на параграфы текста. Однако этот модуль не знает об этом префиксе цитирования.

Я знаю, как закодировать процедуру, которая будет выполнять эту перенос текста, и я не ищу совета по ее написанию. Скорее, мне интересно, знает ли кто-нибудь о каких-либо уже существующих модулях python или python, которые уже могут выполнять такой тип обертывания по цитируемому текстом типа электронной почты.

Я искал, но ничего не нашел в python.

Я просто не хочу «изобретать колесо», если что-то подобное уже написано.

Вот пример переноса текста, который я бы хотел выполнить. Предположим, у меня есть следующий текст, который исходит из гипотетического сообщения электронной почты:

Abc defg hijk lmnop. 

Mary had a little lamb. 
Her fleas were white as snow, 

> Now is the time for all good men to come to the aid of their party. 
> 
> The quick 
> brown fox jumped over the lazy sleeping dog. 

>> When in the Course of human 
>> events it 
>> becomes necessary for one people to dissolve the political 
>> bands 
>> which have 
>> connected them ... 
     and everywhere that Mary went, 
     her fleas were sure to go 
     ... and to reproduce. 
> What do you mean by this? 
>> with another 
>> and to assume among 
>> the powers of the earth ... 
> Doo wah diddy, diddy dum, diddy doo. 
>> Text text text text text text text text text text text text text text text text text text text text text text text text text text text. 

Если предположить, что я хочу, чтобы обернуть в колонке 52, в результате текст должен выглядеть следующим образом:

Abc defg hijk lmnop. 

Mary had a little lamb. Her fleas were white as 
snow, 

> Now is the time for all good men to come to the 
> aid of their party. 
> 
> The quick brown fox jumped over the lazy sleeping 
> dog. 

>> When in the Course of human events it becomes 
>> necessary for one people to dissolve the 
>> political bands which have connected them ... 
     and everywhere that Mary went, her fleas were 
     sure to go ... and to reproduce. 
> What do you mean by this? 
>> with another and to assume among the powers of 
>> the earth ... 
> Doo wah diddy, diddy dum, diddy doo. 
>> Text text text text text text text text text text 
>> text text text text text text text text text text 
>> text text text text text text text. 

Спасибо за любые ссылки к существующему коду python.

Если такой вещи не существует «в дикой природе», я напишу об этом и отправлю свой код здесь.

спасибо.

ответ

0

Я не смог найти какой-либо существующий код, который обертывает этот тип цитируемого текста, поэтому вот код, который я написал. Он использует модули re и textwrap.

Я разбиваю код на «абзацы» в зависимости от количества исходных кодов или символов отступа. Затем я использую textwrap, чтобы обернуть каждый «абзац» префиксом цитаты или отступов, удаленным из каждой строки. После обертывания я снова добавляю префикс к каждой строке «абзаца».

Когда-нибудь я очищу код и сделаю его немного более изящным, но, по крайней мере, он работает нормально, как есть.

import re 
import textwrap 
def wrapemail(text, wrap=72): 
    if not text: 
     return '' 
    prefix  = None 
    prev_prefix = None 
    paragraph = [] 
    paragraphs = [] 
    for line in text.rstrip().split('\n'): 
     line = line.rstrip() 
     m = wrapemail.qprefixpat.search(line) 
     if m: 
      prefix = wrapemail.whitepat.sub('', m.group(1)) 
      text = m.group(2) 
      if text and wrapemail.whitepat.search(text[0]): 
       prefix += text[0] 
       text = text[1:] 
     else: 
      m = wrapemail.wprefixpat.search(line) 
      if m: 
       prefix = m.group(1) 
       text = m.group(2) 
      else: 
       prefix = '' 
       text = line 
     if not text: 
      if paragraph and prev_prefix is not None: 
       paragraphs.append((prev_prefix, paragraph)) 
      paragraphs.append((prefix, [''])) 
      prev_prefix = None 
      paragraph = [] 
     elif prefix != prev_prefix: 
      if paragraph and prev_prefix is not None: 
       paragraphs.append((prev_prefix, paragraph)) 
      prev_prefix = prefix 
      paragraph = [] 
     paragraph.append(text) 
    if paragraph and prefix is not None: 
     paragraphs.append((prefix, paragraph)) 
    result = '' 
    for paragraph in paragraphs: 
     prefix = paragraph[0] 
     text = '\n'.join(paragraph[1]).rstrip() 
     wraplen = wrap - len(prefix) 
     if wraplen < 1: 
      result += '{}{}\n'.format(prefix, text) 
     elif text: 
      for line in textwrap.wrap(text, wraplen): 
       result += '{}{}\n'.format(prefix, line.rstrip()) 
     else: 
      result += '{}\n'.format(prefix) 
    return result 
wrapemail.qprefixpat = re.compile(r'^([\s>]*>)([^>]*)$') 
wrapemail.wprefixpat = re.compile(r'^(\s+)(\S.*)?$') 
wrapemail.whitepat = re.compile(r'\s') 

Кормление текст в моем исходном сообщении к нему с «завернуть» определяется как 52 будет на самом деле производят вывод, что я, указанный выше.

Не стесняйтесь улучшать это или украсть его. :)

 Смежные вопросы

  • Нет связанных вопросов^_^