【问题标题】:Python 3 Omit Characters - Naive methodsPython 3 省略字符 - 天真的方法
【发布时间】:2020-11-17 01:27:03
【问题描述】:

我有一个非常长的文本文件,我打开并保存到一个字符串变量中,我希望删除其中的所有特殊字符并用空格替换它。我不允许导入其他库,所以我必须保持它非常幼稚。我想通过我的文本文件运行一个 for 循环,比较给定的标点符号是否在文本中,然后用“”替换它。然后我会打印更新的文本字符串,出于某种原因(可能是一个受过训练的眼睛的简单修复)我无法删除特殊字符。根据说明,我需要先删除特殊字符,然后再将文本文件的字符串拆分为单词列表。

alice_txt = "Hi! Is my name Alice? I can\"t be too sure about that!" 
def omit_punctuation():
    punct_string = ",.!?;:][-\""
    punct_list = [",",".","!","?",";",":","]","[","-","\""]
    punct_omit = ""
    for mark in punct_list: 
        if mark in alice_txt:
            punct_omit += alice_txt.replace(mark, " ")
    print(punct_omit)
    
omit_characters()

输出:

嗨,我叫爱丽丝吗?我不能太确定你好!我的名字是爱丽丝吗?我不能太确定!你好!我叫爱丽丝吗?我不能太确定!

而不是想要的:嗨,我叫 Alice,我不太确定

我已经使用 punctuation_list 和 :_string 尝试了 for 循环。它看起来(如代码所述)正在查看每个标记,并且当它找到该标记时,它会替换迭代中的每个连续标记,但不会存储每次下一次迭代的替换。在这种方法中我不明白什么?

【问题讨论】:

  • 请提供预期的minimal, reproducible example。显示中间结果与您的预期不同的地方。您的代码片段无法执行,并且您没有发布所需的输出示例。
  • @Prune 对此感到抱歉!我想我现在修复了我的帖子
  • 好多了!我删除了我的关闭投票并撤销了我的反对票。

标签: python for-loop replace


【解决方案1】:

当在punctuation_list 中找不到该字符时,您需要将其添加到punct_omit。否则,你得到的只是空格,而不是普通字符。

您无需调用replace(),只需在punct_omit 后面附加一个空格即可。

另外,您应该遍历文本,而不是 punctuation_string

def omit_characters(text):
    punctuation_string = ",.!?;:][-\""
    punct_omit = ""
    for mark in text: 
        if mark in puctuation_string:
            punct_omit += " "
        else:
            punct_omit += mark
    print(punct_omit)

omit_characters(alice_text)

您也可以使用replace 进行操作。然后你需要在每次迭代中使用之前替换的字符串作为输入:

def omit_characters(text):
    punctuation_string = ",.!?;:][-\""
    for mark in punctuation_string:
        text = text.replace(mark, " ")
    print(text)

【讨论】:

  • 当我阅读你的代码时,它是有道理的,它似乎会做我想做的事,不幸的是,我的输出仍然很不稳定。在我上面编辑的帖子中使用示例字符串。当我运行你的代码时,我的输出是: HiHi 我叫 Alice 吗?我不能太确定是我的名字爱丽丝嗨!是我的名字爱丽丝我不能太确定!我可以嗨!我叫爱丽丝吗?我不能太确定!太确定了嗨,我叫爱丽丝吗?我不能太确定
  • 非常感谢!所以似乎不需要替换功能/它与 += 分配相矛盾。那是对的吗?使用 .replace() 是否有更好(仍然很幼稚)的方法?
  • 非常感谢!我相信几个月前你在另一堂课上帮助了我,所以再次感谢!
【解决方案2】:

如果您只使用 ascii 字符,则以下内容可能会起作用。它替换了字符集。字符基本上只是一个数字 (0-128),可以以任何方式显示(字符集),因此用您的变体替换字符集可以解决问题。
您需要将keyspace 中的不允许字符替换为\x20 以获得" "

def int_to_charset(val, charset):
    output = ""
    while val > 0:
        val, digit = divmod(val, len(charset))
        output += charset[digit]
    # reverse the characters in the output and return
    return output[::-1]


def charset_to_int(s, charset):
    output = 0
    for char in s:
        output = output * len(charset) + charset.index(char)
    return output


def change_charset(s, original_charset, target_charset):
    intermediate_integer = charset_to_int(s, original_charset)
    return int_to_charset(intermediate_integer, target_charset)


origspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\x20\x20#$%&\'()*+\x20-\x20/:;\x20@[\\]^_`{|}~ \t\n\r\x0b\x0c'

text = "Hi! Is my name Alice? I can\"t be too sure about that!"

print(change_charset(text, origspace, keyspace))

【讨论】:

  • “不允许导入其他库”不清楚吗?
  • 这真的很详细@Alex,但我对 Python 真的很陌生(5 周),其中很多超出了我的范围。我很想能够在某个时候达到这个水平,但现在它真的超出了我的想象。不过,感谢您的时间和精力!很想在几周后回到这个问题上,看看我是否可以自己分解它!
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 2015-12-31
  • 2011-04-05
  • 2022-08-07
  • 1970-01-01
  • 2018-08-11
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多