删除除每个单词的第一个字母以外的所有字母,并保持标点符号

时间:2019-10-31 08:41:05

标签: python python-3.x nltk

我有一个名为“ MyTextFile.txt”的文本文件。我要删除所有字母,并在每个单词的第一个字母之外放置破折号,还要保留标点符号

假设文本文件“ MyTextFile.txt”包含以下字符串:

男孩去了学校,然后吃了早餐! 哇,那不是一个好故事!?

所需的结果是这样的:

T-- b-- w-- t- t-- s -----,t-- a-- h-- b -------! W--,t ---的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 b w t t s,t a h b! ,, n! ?

4 个答案:

答案 0 :(得分:4)

这种操作最好用正则表达式完成:

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 :(得分:1)

实际上,@ 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---- ! ?

答案 2 :(得分:1)

请注意,您需要知道以前的字符才能执行此任务-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----!?

说明:我将txttxt[1:]从第二个字符开始以txt开头,然后使用zip创建一个包含两个字符的每个元素的单个可迭代对象:prev即上一页和curr即当前字符,如果两个字母都是我创建的-字符,否则为当前字符,则我将我创建的所有字符都加入并在开始时添加第一个字符(txt[0]) ,因为它没有上一个。

我认为正则表达式更适合此任务,但是给出以上示例,我想表明使用python语言,您可以编写简洁的代码而无需使用正则表达式。

答案 3 :(得分:0)

使用简单的python逻辑::

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)

输出::

这个男孩去了学校,然后吃了早餐!哇,那不是一个好故事!?

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