Удалить все буквы, кроме первой буквы каждого слова, и оставить знаки препинания - PullRequest
1 голос
/ 31 октября 2019

У меня есть текстовый файл с именем «MyTextFile.txt». Я хочу удалить все буквы и поставить на их место тире , кроме первой буквы каждого слова, а также сохранить пунктуацию .

Предположим, текстовый файл «MyTextFile. txt »содержит следующие строки:

Мальчик пошел в школу, затем позавтракал! Ничего себе, это не хорошая история!?

Желаемый результат такой:

T-- b-- w-- t- t-- s -----, t-- a-- h-- b -------! W--, t --- s n-- a n --- s ----! ?

Вот моя работа, которая почти хороша, но не идеальна!

import nltk
file_content = open("MyTextFile.txt", encoding='utf8').read()
tokens = nltk.word_tokenize(file_content)
print(tokens)

first_letter = [i[0] for i in tokens]

new_words = ' '.join(first_letter).strip()
print(new_words)
appendFile = open('results_file.txt', 'w', encoding='utf8')
appendFile.write(new_words)

Мой вывод такой:

T bwtts,тьфу! W, t 'snans!

Ответы [ 4 ]

4 голосов
/ 31 октября 2019

Этот вид манипуляции лучше всего выполнять с помощью регулярного выражения:

import re
txt = "This is a test!"
dashed = re.sub(r"([A-Za-z])([A-Za-z]+)", lambda m: m[1] + "-"*len(m[2]), txt)
print (dashed)

Будет выводить: T--- i- a t---!

И применить его к файлам:

with open("input_file.txt", 'r') as i:
    with open("output_file.txt", 'w') as o:
        for txt in i:
            dashed = re.sub(r"([A-Za-z])([A-Za-z]+)", lambda m: m[1] + "-"*len(m[2]), txt)
            o.write(dashed + '\n')
1 голос
/ 31 октября 2019

Обратите внимание, что вам нужно знать предыдущий символ, чтобы выполнить эту задачу - zip будет полезно:

txt = "The boy went to the school, then ate his breakfast! Wow, that’s not a nice story!?"
new_txt = txt[0] + ''.join('-' if curr.isalpha() and prev.isalpha() else curr for prev, curr in zip(txt,txt[1:]))
print(new_txt)

Вывод:

T-- b-- w--- t- t-- s-----, t--- a-- h-- b--------! W--, t---- n-- a n--- s----!?

Объяснение: Я беру txt и txt[1:], то есть txt, начинающийся со 2-го символа, затем используйте zip, чтобы создать одну итерацию с каждым элементом, состоящим из двух символов: prev т.е. предыдущий и curr то есть текущий, если оба являются буквами, которые я делаю - в противном случае текущий символ, затем я присоединяю все созданные мной символы и добавляю первый символ (txt[0]) при запуске, как это считалось ранее, потому что у него нет предыдущего.

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

1 голос
/ 31 октября 2019

На самом деле, @Uri ответ намного лучше, чем мой. Вот это все равно:)

import nltk

file_content = "The boy went to the school, then ate his breakfast! Wow, that’s not a nice story!?"
tokens = nltk.word_tokenize(file_content)
print(tokens)

new_words = []
for token in tokens:
    token = token.strip() 
    if token.isalpha():
        new_word = token[0]
        new_word += "-"*(len(token)-1)
    else:
        new_word = token
    new_words.append(new_word)

new_words = ' '.join(new_words)
print(new_words)
# T-- b-- w--- t- t-- s----- , t--- a-- h-- b-------- ! W-- , t--- ’ s n-- a n--- s---- ! ?
0 голосов
/ 31 октября 2019

Используя простую логику питона ::

def keepPunc(x):
    temp = x[0]
    for i in range(1,len(x)):
        if x[i].isalpha():
            temp=temp+"-"
        else:
            temp=temp+x[i]
    return temp



def func(a):
    temp = a.split()
    final = [i[0]+"-"*(len(i)-1) if i.isalpha() else keepPunc(i)for i in temp]
    print(a)
    print(' '.join(final))

a = "The boy went to the school, then ate his breakfast! Wow, that’s not a nice story!?"
func(a)

output ::

Мальчик пошел в школу, затем позавтракал! Вау, это не хорошая история!?

T-- b-- w --- t- t-- s -----, t --- a-- h-- b--------! W--, t ---'- n-- a n --- s ----!?

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