在Python中从字符串中删除非字母数字字符但保留特殊字符

4

我知道类似的问题在StackOverflow上已经被问过了。我尝试了一些方法,但是没有找到符合我的需求的可行方案:

给定一个Python字符串,我想去除每个非字母数字字符,但是保留任何特殊字符,如µ æ Å Ç ß…。这是否可能?使用正则表达式,我尝试了以下变化:

re.sub(r'[^a-zA-Z0-9: ]', '', x) # x is my string to sanitize

但它剥夺了我更多的东西,而我并不想要那么多。我想要的一个例子是:
Input:  "A string, with characters µ, æ, Å, Ç, ß,... Some    whitespace  confusion  ?"
Output: "A string with characters µ æ Å Ç ß Some whitespace confusion"

这是否可能在不变得复杂的情况下实现?


1
"Special character" 没有意义。 - Glenn Maynard
从问题描述来看,似乎OP想要保留字母、数字、冒号和空格。@Druss,这是正确的吗? - Ray Toal
@Ray:除了冒号以外,其他都正确。我根本不需要任何标点符号。 :) - Aufwind
你想保留字母、数字和空格,是吗?那我会在下面更改我的答案。 - Ray Toal
4个回答

3

使用设置了UNICODE标志的\w。这将匹配下划线,因此您可能需要单独处理它。

有关详细信息,请参见http://docs.python.org/library/re.html

编辑:这里是一些实际代码。它将保留Unicode字母,Unicode数字和空格。

import re
x = u'$a_bßπ7: ^^@p'
pattern = re.compile(r'[^\w\s]', re.U)
re.sub(r'_', '', re.sub(pattern, '', x))

如果您没有使用re.U,则ß和π字符将被剥离。
抱歉,我无法找到一种只需一个正则表达式即可完成此操作的方法。如果您有,请发布解决方案。

3

消除“标点符号,其他”Unicode类别中的字符。

# -*- coding: utf-8 -*-

import unicodedata

# This removes punctuation characters.
def strip_po(s):
  return ''.join(x for x in s if unicodedata.category(x) != 'Po')

# This reduces multiple whitespace characters into a single space.
def fix_space(s):
  return ' '.join(s.split())

s = u'A string, with characters µ, æ, Å, Ç, ß,... Some    whitespace  confusion  ?'
print fix_space(strip_po(s))

很好 - 我不知道这个存在。 - dfb

1

如果您认可Unicode Consortium对字母或数字的分类,那么一种不需要使用正则表达式或导入任何外部内置内容的简单方法是:

filter(unicode.isalnum, u"A string, with characters µ, æ, Å, Ç, ß,... Some    whitespace  confusion  ?")

如果您有一个str而不是unicode,您需要先进行编码。


1

你需要更好地定义你所说的特殊字符。有一些标志可以将空格、非空格、数字等分组,并针对特定的语言环境进行操作。请参见http://docs.python.org/library/re.html了解更多细节。

然而,由于这是一个逐个字符的操作,你可能会发现直接明确指定每个字符更容易,或者如果要排除的字符数量较少,则编写仅排除这些字符的表达式更为简单。


感谢关于locale的信息。直到现在我才开始考虑它。 - Aufwind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接