【问题标题】:Getting non-alphanumeric characters after stripping them off剥离非字母数字字符后获取它们
【发布时间】:2017-12-29 20:56:46
【问题描述】:

我正在使用以下正则表达式从string 中去除非字母数字字符(不删除空格)。

pattern = re.compile('([^\s\w]|_)+', re.UNICODE)

但是,过滤后我仍然得到以下字符串:

ç
 √§√§√§  √°  √°
à
 åî òëâáä
öè
ãóûåüôç ñùü
ç ç
ôùñ öùî íîêïî
îïáìõáíö
ùèõáíö
òííòê õáíö
ø â áí
åîæíî
ííö ùîòõàä
√§
 èèñ ñùü
èèñ ñùü
äóòåô êã
ïùùïäó ñùü
üíûçôñó ñùü

如何使用正则表达式处理它们?我希望上述字符串在删除非字母数字字符后变为空字符串。

我有一个我正在尝试预处理的用户查询列表。我提供的相关代码sn-p如下。

query_text = ' '.join([pattern.sub(' ', word) for word in tokens[1].lower().split()])
query_text = query_text.strip()

请注意:

  • 我正在处理的问题是删除除给定字符串的空格之外的任何非字母数字字符。
  • 删除基于英语的非字母数字字符。

【问题讨论】:

  • 您只需显示编译表达式的代码。您实际使用的代码在哪里?
  • @BrenBarn 添加了。
  • 不清楚您要做什么。这里的过滤是什么? pattern.sub?
  • 基于哪种语言的非字母数字字符?英语/拉丁语?
  • 我正在尝试删除基于英语的非字母数字字符。是的,pattern.sub就是这里的过滤过程。

标签: python


【解决方案1】:

使用 re.UNICODE 标志(至少在我的 Python 版本中,也没有它),\w 类包含许多“非英语”字母数字字符,例如希腊字母、变音符号、连字和其他。如果您也想删除这些,则不应使用\w,而应使用更“显式”的字符类,例如a-zA-Z0-9

>>> pattern = re.compile('([^\s\w]|_)+', re.UNICODE)
>>> pattern.sub("", text)
'ß\n     \n\n Æ \n\nªºß πº\nß ß\nπ πÆ ÆØÆ\nÆØµ\nπµ\n µ\n  \nÆÆ\n πƵ\n\n  πº\n πº\n \nØππØ πº\nºªß πº'
>>> pattern = re.compile('[^\sa-zA-Z0-9]+', re.UNICODE)
>>> pattern.sub("", text)
'\n     \n\n  \n\n \n \n  \n\n\n \n  \n\n \n\n  \n \n \n \n '

或者您可以显式设置re.ASCII 标志,以便\w 实际上等同于[a-zA-Z0-9_]

>>> re.sub("[^\s\w]", "", text, flags=re.UNICODE)
'ß\n     \n\n Æ \n\nªºß πº\nß ß\nπ πÆ ÆØÆ\nÆØµ\nπµ\n µ\n  \nÆÆ\n πƵ\n\n  πº\n πº\n \nØππØ πº\nºªß πº'
>>> re.sub("[^\s\w]", "", text, flags=re.ASCII)
'\n     \n\n  \n\n \n \n  \n\n\n \n  \n\n \n\n  \n \n \n \n '

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多