Answers:
这可以不用正则表达式来完成:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
您可以使用str.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
如果您坚持使用正则表达式,则其他解决方案也可以。但是请注意,如果可以在不使用正则表达式的情况下完成此操作,那么这是最好的解决方法。
isalnum()
和regex版本均进行了基准测试,而regex则提高了50-75%
这是一个正则表达式,用于匹配不是字母或数字的字符串:
[^A-Za-z0-9]+
这是执行正则表达式替换的Python命令:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
量词以提高其效率。)
[^A-Za-z0-9 ]+
较短的方法:
import re
cleanString = re.sub('\W+','', string )
如果要在单词和数字之间留空格,请用''代替'
看到这一点之后,我有兴趣通过找出执行时间最短的方法来扩展所提供的答案,因此我仔细检查了一些建议的答案,并timeit
对照了两个示例字符串:
string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
'.join(e for e in string if e.isalnum())
string1
-结果:10.7061979771string2
-结果:7.77832597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
-结果:7.10785102844string2
-结果:4.12814903259import re
re.sub('\W+','', string)
string1
-结果:3.11899876595string2
-结果:2.78014397621以上结果是以下平均值的最低返回结果的乘积: repeat(3, 2000000)
示例3的速度可以比示例1快3倍。
''.join([*filter(str.isalnum, string)])
我认为filter(str.isalnum, string)
效果很好
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
在Python3中,filter( )
函数将返回一个可迭代的对象(而不是上面的字符串)。必须重新加入以从itertable中获取字符串:
''.join(filter(str.isalnum, string))
或通过list
加入使用(不确定,但可以很快)
''.join([*filter(str.isalnum, string)])
注意:[*args]
从Python> = 3.5中解压缩有效
map
中filter
,并reduce
返回可迭代的对象。仍然在Python3 +中,我会更喜欢 ''.join(filter(str.isalnum, string))
(或在join use中传递列表''.join([*filter(str.isalnum, string)])
)而不是可接受的答案。
''.join(filter(str.isalnum, string))
方面是否有所改进filter(str.isalnum, string)
。这真的是Pythreenic(是的,您可以使用该方法)吗?
filter(str.isalnum, string)
不Python3返回字符串filter( )
在Python3返回迭代器,而不是不同的Python-2参数类型+。
与使用正则表达式的其他所有人不同,我将尝试排除不想要的每个字符,而不是明确枚举不需要的字符。
例如,如果我只需要'a到z'字符(大写和小写)和数字,我将排除所有其他内容:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
这意味着“用空字符串替换每个不是数字的字符,或者用'a到z'或'A到Z'范围内的字符代替”。
实际上,如果^
在正则表达式的第一位插入特殊字符,则会得到否定。
额外提示:如果您还需要将结果小写,则可以使正则表达式更快,更轻松,只要您现在找不到大写即可。
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
最通用的方法是使用unicodedata表的“类别”,该表对每个单个字符进行分类。例如,以下代码根据其类别仅过滤可打印字符:
import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien
PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))
def filter_non_printable(s):
result = []
ws_last = False
for c in s:
c = unicodedata.category(c) in PRINTABLE and c or u'#'
result.append(c)
return u''.join(result).replace(u'#', u' ')
查看上面所有相关类别的给定URL。当然,您也可以按标点符号类别进行过滤。
$
,在每一行的结束?
使用翻译:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
警告:仅适用于ASCII字符串。
TypeError: translate() takes exactly one argument (2 given)
py3.4
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the
与双引号相同。“”“
# if we need to count the word python that ends with or without ',' or '.' at end
count = 0
for i in text:
if i.endswith("."):
text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
count += 1
print("The count of Python : ", text.count("python"))
删除标点,数字和特殊字符
例子:-
码
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
谢谢 :)