【问题标题】:Removing Words that contain non-ascii characters using Python使用 Python 删除包含非 ascii 字符的单词
【发布时间】:2017-04-28 19:21:18
【问题描述】:

我正在使用以下函数来去除非 ascii 字符

def removeNonAscii(s): 
    return "".join(filter(lambda x: ord(x)<128, s))

def removeNonAscii1(s): 
    return "".join(i for i in s if ord(i)<128)

如果它包含任何非 ascii 字符,我现在想删除整个单词。我想过测量长度前后功能应用,但我相信有一种更有效的方法。有什么想法吗?

【问题讨论】:

  • 您的意思是删除非ascii字词吗?
  • 检查字符串的所有字符,然后找到正确的字符。

标签: python python-unicode


【解决方案1】:

如果您根据空格定义单词,可能会这样:

def containsNonAscii(s):
    return any(ord(i)>127 for i in s)

words = sentence.split()
cleaned_words = [word for word in words if  not containsNonAscii(word)]
cleaned_sentence = ' '.join(cleaned_words)

请注意,这会将重复的空格折叠成一个空格。

【讨论】:

  • 他的函数已经完成了join。无需使用列表推导
  • 没错,但我假设重新定义了他的功能。这不完全清楚......我也会在新版本中进行编辑。
【解决方案2】:

最干净(但不一定最有效)的方法是将一个单词转换为二进制,然后尝试将其解码为 ASCII。如果尝试失败,则该单词包含非 ASCII 字符:

def is_ascii(w):
  try:
    w.encode().decode("us-ascii")
    return True
  except UnicodeEncodeError:
    return False

【讨论】:

  • @JonClements 不需要。 decode() 不会引发任何其他异常。不过没关系。
  • 但是decod 或输入错误的“us-ascii”等... 经验法则是始终捕获您知道如何处理的东西,让其余的传播直到它可。一个光秃秃的except 将捕获并屏蔽所有内容,您所知道的是您的函数正在返回False,即使它不应该等等...
【解决方案3】:

我想出了以下功能。我删除了所有包含任何 ASCII 字符但范围可以根据需要扩展的单词。

def removeWordsWithASCII(s):
    " ".join(filter(lambda x: not re.search(r'[\x20-\x7E]', x), s.split(' ')))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2021-03-14
    • 2016-03-01
    • 2011-02-14
    相关资源
    最近更新 更多