【问题标题】:Changing words in a string using dictionary. python使用字典更改字符串中的单词。 Python
【发布时间】:2016-08-18 07:54:40
【问题描述】:

我收到以下消息:

msg = "Cowlishaw Street & Athllon Drive, Greenway now free of obstruction."

我想将“Drive”更改为“Dr”或将“Street”更改为“St”等内容

expected_msg = "Cowlishaw St and Athllon Dr Greenway now free of obstruction"

我还有一个“转换功能”

如果列表中有这样的单词,我如何检查列表。如果是这样,请使用“转换”功能对其进行更改。 “conversion”是一个字典,以“Drive”等单词为键,值为“Dr”

这就是我所做的

def convert_message(msg, conversion):
    msg = msg.translate({ord(i): None for i in ".,"})
    tokens = msg.strip().split(" ")
    for x in msg:
         if x in keys (conversion):


    return " ".join(tokens)

【问题讨论】:

  • 您能否尝试使示例代码的格式正确?
  • 你不能只使用msg.replace("Drive","Dr")等吗?
  • for "Drive" in msg 根本不是正确的 Python。既然你有字典,你应该把它包含在问题中。
  • 您可能想查看 nltk 来标记您的字符串,顺便说一句。处理标点符号等等。
  • @Chris_Rands 是的,我可以这样做。但我的导师说这是不允许的,因为它有点硬编码。我们要做的是遍历字符串中的消息。然后如果我们在字典“conversion”中找到也是键的单词,那么我们转换那些单词,它们是该转换字典中的对应值。

标签: python string dictionary


【解决方案1】:

是不是很简单:

translations = {'Drive': 'Dr'}

for index, token in enumerate(tokens):
    if token in conversion:
        tokens[index] = conversion[token]

return ' '.join(tokens)

但是,这不适用于像 "Obstruction on Cowlishaw Street." 这样的句子,因为现在的标记是 Street.。也许您应该使用带有re.sub 的正则表达式:

import re
def convert_message(msg, conversion):
    def translate(match):
        word = match.group(0)
        if word in conversion:
            return conversion[word]
        return word

    return re.sub(r'\w+', translate, msg)

re.sub 在这里找到 1 个或多个连续 (+) 字母数字字符 (\w);并且对于每个这样的正则表达式匹配调用给定的函数,将匹配作为参数;可以使用match.group(0) 检索匹配的单词。该函数应返回给定匹配项的替换项 - 在这里,如果在字典中找到该单词,我们将返回该单词,否则返回原始单词。

因此:

>>> msg = "Cowlishaw Street & Athllon Drive, Greenway now free of obstruction."
>>> convert_message(msg, {'Drive': 'Dr', 'Street': 'St'})
'Cowlishaw St & Athllon Dr, Greenway now free of obstruction.'

至于&,在Python 3.4+ 上你应该使用html.unescape 来解码HTML 实体:

>>> import html
>>> html.unescape('Cowlishaw Street & Athllon Drive, Greenway now free of obstruction.')
'Cowlishaw Street & Athllon Drive, Greenway now free of obstruction.'

这将处理 所有 已知的 HTML 实体。对于较旧的 python 版本,您可以查看alternatives on this question

正则表达式与&字符不匹配;如果你也想替换它,我们可以使用正则表达式\w+|.,这意味着:“任何连续的字母数字字符,或者任何不在这样的运行中的单个字符”:

import re
import html


def convert_message(msg, conversion):
    msg = html.unescape(msg)

    def translate(match):
        word = match.group(0)
        if word in conversion:
            return conversion[word]
        return word

    return re.sub(r'\w+|.', translate, msg)

那你就可以了

>>> msg = 'Cowlishaw Street & Athllon Drive, Greenway now free of obstruction.'
>>> convert_message(msg, {'Drive': 'Dr', '&': 'and', 
                          'Street': 'St', '.': '', ',': ''})
'Cowlishaw St and Athllon Dr Greenway now free of obstruction'

【讨论】:

  • 第一个有效,因为您在那里定义的翻译已经为每个单词的情况定义了。并且每次测试都是单独进行的。谢谢
  • OP 显然想要&amp' -> and - 但我相信他们可以通过翻译解决这个问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
相关资源
最近更新 更多