从字符串中剥离标点符号的最佳方法
似乎应该有一个比这更简单的方法。
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
有吗?
570
20
似乎应该有一个比这更简单的方法。
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
有吗?
从效率的角度来看,你不可能打败他们。
对于更高版本的Python,使用以下代码。
它在C语言中使用查找表进行原始字符串操作--除了编写自己的C语言代码外,没有什么能比这更好的了。
如果速度不是一个问题,另一个选择是。
这比每个字符的s.replace要快,但性能不如非纯python方法,如regexes或string.translate,从下面的时间可以看出。 对于这种类型的问题,在尽可能低的层次上进行处理是有好处的。
计时代码。
这就得到了以下结果。
正则表达式很简单,如果你知道的话。
为了使用方便,我总结了Python 2和Python 3中从字符串中剥离标点符号的注意事项。 详细说明请参考其他答案。
Python 2
Python 3
我通常使用这样的东西。
string.punctuation
是ASCII码*唯一的! 一个更正确(但也更慢)的方法是使用unicodedata模块。你也可以概括和剥离其他类型的字符。
它还将剥离像
~*+§$
这样的字符,可能是或可能不是"标点符号"。 取决于一个人'的观点。不一定更简单,但不同的方式,如果你对re家族更熟悉。
对于Python 3
str
或Python 2unicode
值,str.translate()
只接受一个字典。 编码点(整数)在该映射中被查找,任何映射到None
的东西都会被删除。如果要删除(一些?)标点符号,可以使用。
dict.fromkeys()
类方法使创建映射变得微不足道,根据键的序列将所有值设置为None
。要删除*所有的标点符号,而不仅仅是ASCII标点符号,你的表需要更大一些。 参见J.F. Sebastian'的回答 (Python 3版本)。
string.punctuation
漏掉了现实世界中常用的大量标点符号。 那么有一个对非ASCII标点符号有效的解决方案呢?个人认为,这是Python中删除字符串中标点符号的最好方法,因为。
\{S}
,但保留$
等符号。/{Pd}
只删除破折号。这使用了Unicode字符属性,你可以在维基百科上阅读更多信息。
1:
我还没有看到这个答案。 只需使用一个regex。 它删除了除了单词字符(
\w
)和数字字符(\d
)以外的所有字符,后面还有一个空格字符(\s
)。这里有一个Python 3.5的单行本。
这是我写的一个函数。 它的效率不高,但很简单,你可以添加或删除任何你想要的标点符号。
这可能不是最好的解决办法,但我就是这样做的。
作为一个更新,我在 Python 3 中重写了 @Brian 的例子,并对其进行了修改,将 regex 编译步骤移到了函数内部。 我在这里的想法是把每一个步骤的时间都安排好,以使函数工作。 也许你使用的是分布式计算,不能在你的工作者之间共享regex对象,需要在每个工作者处有
re.compile
步骤。 另外,我很好奇的是,对Python 3的maketrans的两种不同实现进行时间上的调整。与
另外,我还增加了另一个使用set的方法,我利用交集函数来减少迭代次数。
这是完整的代码。
这是我的结果。
这里有一个不用regex的解决方案。
在不是很严格的情况下,一言堂也许会有帮助。