【问题标题】:How can I replace each letter in the sentence to sentence without breaking it?如何在不破坏句子的情况下将句子中的每个字母替换为句子?
【发布时间】:2018-10-05 10:21:27
【问题描述】:

这是我的问题。

    sentence = "This car is awsome."

而我想做的是

    sentence.replace("a","<emoji:a>")
    sentence.replace("b","<emoji:b>")
    sentence.replace("c","<emoji:c>")

等等……

当然,如果我这样做,"&lt;emoji:&gt;" 中的字母也会随着我的进行而被替换。那么我该怎么做呢?

【问题讨论】:

标签: python-3.x


【解决方案1】:

正如卡洛斯·冈萨雷斯建议的那样:

创建一个映射字典并按顺序应用到每个字符:

sentence = "This car is awsome."

# mapping
up = {"a":"<emoji:a>",
      "b":"<emoji:b>",
      "c":"<emoji:c>",}

# apply mapping to create a new text (use up[k] if present else default to k)
text = ''.join( (up.get(k,k) for k in sentence) )

print(text)

输出:

This <emoji:c><emoji:a>r is <emoji:a>wsome.

''.join( ... generator ...) 中的生成器表达式的优点是它获取sentence 的每个单个字符,要么保留它,要么替换它。它只接触每个字符一次,因此不存在多次替换的危险,并且只需通过 sentence 一次即可转换整个内容。

独库:dict.get(key,default)Why dict.get(key) instead of dict[key]?


如果你用过

sentence = sentence.replace("a","o")
sentence = sentence.replace("o","k")

您将首先从a 生成o,然后从任何o(或之前的a)生成k - 您必须触摸每个字符两次才能实现。

使用

up = { "a":"o", "o":"k" }
text = ''.join( (up.get(k,k) for k in sentence) )

避免这种情况。

【讨论】:

  • 您可以通过将"e":"&lt;emoji:e&gt;" 添加到up 来轻松欺骗此代码...我认为这是问题的重点。
  • @norok2 你试过了吗?如果你一个接一个地替换它,你可以愚弄它——但列表组合不会。它适用于sentence 的每一个字符,并创建一个迭代生成器来保留或替换它。然后发电机再次粘在一起。没有任何东西被多次处理。 - 如果您按照建议附加到up,则text 将是This &lt;emoji:c&gt;&lt;emoji:a&gt;r is &lt;emoji:a&gt;wsom&lt;emoji:e&gt;
  • 你是对的。我读得太快了。但是这个技巧不适用于多字符替换,对吧?
  • @norok2 如果你想替换超过 1 个字符,使用 regex 和 sub 更容易做到这一点 - 请参阅 passing a function to re.sub in python - 但那需要 re 模块作为导入并且不需要这种情况 - 请参阅我发布的第二个答案。
【解决方案2】:

如果您想一次替换超过 1 个字符,使用正则表达式会更容易。灵感来自Passing a function to re.sub in Python

import re 

sentence = "This car is awsome."

up = {"is":"Yippi",
      "ws":"WhatNot",}

# modified it to create the groups using the dicts key
text2 = re.sub( "("+'|'.join(up)+")", lambda x: up[x.group()], sentence)

print(text2)

输出:

ThYippi car Yippi aWhatNotome.

独库:re.sub(pattern, repl, string, count=0, flags=0)

如果您想使用“正则表达式”特定字符(如果用作正则表达式模式 - f.e.),则您必须格外小心您的键。 .+*?()[]^$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2015-01-25
    • 2022-11-16
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多