在文字上有效使用.replace

时间:2019-06-14 16:19:16

标签: python python-3.x replace

我试图将仅出现一次的一段文字中的所有单词都大写。我有一点发现哪些单词只会出现一次,但是当我用.upper版本替换原始单词时,其他很多东西也被大写了。这是一个小程序,所以这里是代码。

from collections import Counter
from string import punctuation

 path = input("Path to file: ")
 with open(path) as f:
    word_counts = Counter(word.strip(punctuation) for line in f for word in line.replace(")", " ").replace("(", " ")
                      .replace(":", " ").replace("", " ").split())

wordlist = open(path).read().replace("\n", " ").replace(")", " ").replace("(", " ").replace("", " ")

unique = [word for word, count in word_counts.items() if count == 1]

for word in unique:
    print(word)
    wordlist = wordlist.replace(word, str(word.upper()))

print(wordlist)

输出应为'Genesis 37:1 Jacob lived in the land of his father's SOJOURNINGS, in the land of Canaan.,因为逗留是第一个只出现一次的单词。而是输出GenesIs 37:1 Jacob lIved In the land of hIs FATher's SOJOURNINGS, In the land of Canaan.,因为其他一些字母出现在关键字中,它也会尝试将它们大写。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

由于一些链接的replace调用可能被证明是不可靠的,因此我对代码进行了相当大的重写。

import string

# The sentence.
sentence = "Genesis 37:1 Jacob lived in the land of his father's SOJOURNINGS, in the land of Canaan."

rm_punc = sentence.translate(None, string.punctuation)  # remove punctuation
words = rm_punc.split(' ')  # split spaces to get a list of words

# Find all unique word occurrences.
single_occurrences = []
for word in words:
    # if word only occurs 1 time, append it to the list
    if words.count(word) == 1:
        single_occurrences.append(word)

# For each unique word, find it's index and capitalize the letter at that index
# in the initial string (the letter at that index is also the first letter of
# the word). Note that strings are immutable, so we are actually creating a new
# string on each iteration. Also, sometimes small words occur inside of other
# words, e.g. 'an' inside of 'land'. In order to make sure that our call to
# `index()` doesn't find these small words, we keep track of `start` which
# makes sure we only ever search from the end of the previously found word.
start = 0
for word in single_occurrences:
    try:
        word_idx = start + sentence[start:].index(word)
    except ValueError:
        # Could not find word in sentence. Skip it.
        pass
    else:
        # Update counter.
        start = word_idx + len(word)

        # Rebuild sentence with capitalization.
        first_letter = sentence[word_idx].upper()
        sentence = sentence[:word_idx] + first_letter + sentence[word_idx+1:]

print(sentence)

答案 1 :(得分:0)

通过模式替换文本需要regex

您的文字有点棘手,您必须

  • 删除数字
  • 删除朋克
  • 分解成文字
  • 关心大小写:'It's''it's'
  • 替换 mote
  • 仅替换 full 匹配'remote''mote'

这应该执行此操作-有关说明,请参阅内部注释:

bible.txt来自your link

from collections import Counter
from string import punctuation , digits

import re

from collections import defaultdict

with open(r"SO\AllThingsPython\P4\bible.txt") as f:
    s = f.read()

# get a set of unwanted characters and clean the text
ps = set(punctuation + digits)  
s2 = ''.join( c for c in s if c not in ps) 

# split into words
s3 = s2.split()

# create a set of all capitalizations of each word
repl = defaultdict(set)
for word in s3:
    repl[word.upper()].add(word)  # f.e. {..., 'IN': {'In', 'in'}, 'THE': {'The', 'the'}, ...}

# count all words _upper case_ and use those that only occure once
single_occurence_upper_words = [w for w,n in Counter( (w.upper() for w in s3) ).most_common() if n == 1]
text = s

# now the replace part - for all upper single words 
for upp in single_occurence_upper_words:

    # for all occuring capitalizations in the text
    for orig in repl[upp]:

        # use regex replace to find the original word from our repl dict with 
        # space/punktuation before/after it and replace it with the uppercase word
        text = re.sub(f"(?<=[{punctuation} ])({orig})(?=[{punctuation} ])",upp, text)

print(text)

输出(缩短):

Genesis 37:1 Jacob lived in the land of his father's SOJOURNINGS, in the land of Canaan.

2 These are the GENERATIONS of Jacob.

Joseph, being seventeen years old, was pasturing the flock with his brothers. He was a boy with the sons of Bilhah and Zilpah, his father's wives. And Joseph brought a BAD report of them to their father. 3 Now Israel loved Joseph more than any other of his sons, because he was the son of his old age. And he made him a robe of many colors. [a] 4 But when his brothers saw that their father loved him more than all his brothers, they hated him
and could not speak PEACEFULLY to him. 

<snipp>

正则表达式使用先行'(?=...)'和后退'(?<=...)'语法来确保仅替换完整的单词,请参见regex syntax