【问题标题】:Remove non alphanumeric from string but keeping encoded non-ASCII characters åäö从字符串中删除非字母数字,但保留编码的非 ASCII 字符 åäö
【发布时间】:2014-01-07 23:35:27
【问题描述】:

如何保留 åäö 但从字符串中删除所有其他非字母数字字符? (我发现了类似的问题,但似乎没有一个正确的答案。)

我尝试了诸如扩展正则表达式以尝试使其跳过 sub 中的 åäö 之类的东西,但它似乎只是使正则表达式停止一起工作,让空格等也保留下来。 我通常不使用 python 编程,只是想帮助一个朋友,所以可能有一些比使用 re 更好的方法来清理字符串。

通过谷歌搜索,我认为这与 Unicode 有关,但没有好的解决方案。

def ordnaText(text): 
    text = text.lower()
    text = re.sub('\W', '', text)
    if text.isalnum() == True:
        return text

【问题讨论】:

  • 这是 python 2 还是 3?
  • 什么是type(text)
  • 我不是 100% 确定你的意思 Eric,但它是一个字符串?来自 raw_input
  • @A.collin:这是一条重要的信息。
  • @A.collin:当你在代码中添加print type(text)这一行时,输出是什么?

标签: python regex encode python-2.x non-ascii-characters


【解决方案1】:

您正在尝试匹配 encoded 输入; Python 2 中的raw_input() 总是返回一个字节字符串。这意味着您使用的终端、控制台或 IDE 决定了输入使用的编码。

尝试使用正则表达式匹配非 ASCII 字符,使用字节字符串需要您完全匹配 编码 字节,这通常意味着终端环境或源代码编辑器设置的任何更改会导致匹配失败。

你想在这里显式解码raw_input(),并使用Unicode匹配:

import sys
import re

def ordnaText(text): 
    text = text.lower()
    text = re.sub(u'\W', '', text, flags=re.UNICODE)
    if text.isalnum() == True:
        return text

userinput = raw_input('....')
userinput = userinput.decode(sys.stdin.encoding)
something = ordnaText(userinput)

sys.stdin.encoding 告诉你 Python 认为输入编解码器是什么。使用 flags=re.UNICODE 专门打开正则表达式引擎中的 unicode 支持。 u'\W' 给引擎一个 Unicode 字符串文字;后者是可选的,但最好是明确的。

如果您想了解更多关于 Unicode、编码字节字符串以及它与 Python 的关系,我建议您阅读:

【讨论】:

    【解决方案2】:

    您可以将\W 替换为[^\wåäö]

    但是,如果字符串包含重音字符,则测试 text.isalnum 将返回 false。

    【讨论】:

    • 是的,我试过了,但出于某种愚蠢的原因,仍然删除了 åäö:S
    • @user2225454:奇怪!我已经用 pythex.org 对其进行了测试,它似乎可以工作。
    • 你在使用u'[^\wåäö]'吗?
    • u 告诉 python “这是一个 unicode 代码点序列,而不是一个字节序列”
    • 请注意,您仍然可能过得不好 - 尝试在字符串 ääa
    【解决方案3】:

    尝试在re.sub()中使用标志re.UNICODE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2010-12-04
      相关资源
      最近更新 更多