>>> # Character stripping
>>> a = '?abcd1234!!'
>>> t.lstrip('?')
'abcd1234!!'
>>> t.strip('?!')
'abcd1234'
3
这是我的Python 2/3兼容版本 . 由于翻译api已经改变 .
def remove(str_, chars):
"""Removes each char in `chars` from `str_`.
Args:
str_: String to remove characters from
chars: String of to-be removed characters
Returns:
A copy of str_ with `chars` removed
Example:
remove("What?!?: darn;", " ?.!:;") => 'Whatdarn'
"""
try:
# Python2.x
return str_.translate(None, chars)
except TypeError:
# Python 3.x
table = {ord(char): None for char in chars}
return str_.translate(table)
170
以下是实现此任务的一些可能方法:
def attempt1(string):
return "".join([v for v in string if v not in ("a", "e", "i", "o", "u")])
def attempt2(string):
for v in ("a", "e", "i", "o", "u"):
string = string.replace(v, "")
return string
def attempt3(string):
import re
for v in ("a", "e", "i", "o", "u"):
string = re.sub(v, "", string)
return string
def attempt4(string):
return string.replace("a", "").replace("e", "").replace("i", "").replace("o", "").replace("u", "")
for attempt in [attempt1, attempt2, attempt3, attempt4]:
print(attempt("murcielago"))
import timeit
K = 1000000
for i in range(1,5):
t = timeit.Timer(
f"attempt{i}('murcielago')",
setup=f"from __main__ import attempt{i}"
).repeat(1, K)
print(f"attempt{i}",min(t))
#!/usr/bin/python
import re
strs = "how^ much for{} the maple syrup? $20.99? That's[] ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!|a|b]',r' ',strs)#i have taken special character to remove but any #character can be added here
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)#for removing special character
print nestr
3
这个怎么样:
def text_cleanup(text):
new = ""
for i in text:
if i not in " ?.!/;:":
new += i
return new
import re # Regular expression library
def string_cleanup(x, notwanted):
for item in notwanted:
x = re.sub(item, '', x)
return x
line = "<title>My example: <strong>A text %very% $clean!!</strong></title>"
print("Uncleaned: ", line)
# Get rid of html elements
html_elements = ["<title>", "</title>", "<strong>", "</strong>"]
line = string_cleanup(line, html_elements)
print("1st clean: ", line)
# Get rid of special characters
special_chars = ["[!@#$]", "%"]
line = string_cleanup(line, special_chars)
print("2nd clean: ", line)
Uncleaned: <title>My example: <strong>A text %very% $clean!!</strong></title>
1st clean: My example: A text %very% $clean!!
2nd clean: My example: A text very clean
25 回答
Python中的字符串是不可变的(不能更改) . 因此,
line.replace(...)
的效果只是创建一个新字符串,而不是更改旧字符串 . 您需要将其重新绑定(分配)为line
,以使该变量获取新值,并删除这些字符 .而且,你这样做的方式相对较慢 . 对于经验丰富的pythonator来说,这也有点令人困惑,他们会看到一个双重嵌套的结构,并想一想更复杂的事情正在发生 .
从Python 2.6和更新的Python 2.x版本*开始,您可以使用str.translate,(但请继续阅读Python 3的差异):
或使用re.sub替换正则表达式
括号中的字符构成一个字符类 .
line
中该类中的任何字符都被第二个参数替换为sub
:一个空字符串 .在Python 3中,字符串是Unicode . 你将不得不翻译一点点 . kevpie在其中一个答案中提到了这一点,并在documentation for str.translate中注明了这一点 .
调用Unicode字符串的
translate
方法时,无法传递上面使用的第二个参数 . 您也无法将None
作为第一个参数传递,甚至不能传递string.maketrans
的转换表 . 而是将字典作为唯一参数传递 . 这个字典将字符的序数值(即调用它们的ord的结果)映射到应该替换它们的字符的序数值,或者对于我们有用的None
来表示它们应该被删除 .所以要用Unicode字符串做上面的舞蹈,你会称之为
这里dict.fromkeys和map用于简洁地生成包含的字典
更简单,如another answer puts it,创建字典:
*为了与早期的Pythons兼容,您可以创建一个"null"转换表来代替
None
:这里string.maketrans用于创建转换表,它只是一个包含序号值为0到255的字符的字符串 .
我在这里忽略了这一点,还是仅仅是以下内容:
把它放在一个循环中:
提问者几乎拥有它 . 像Python中的大多数东西一样,答案比你想象的要简单 .
您不必执行嵌套的if / for循环操作,但您需要单独检查每个字符 .
对于字符串中 only allowing certain characters 的反向要求,可以使用带有set complement运算符
[^ABCabc]
的正则表达式 . 例如,要删除除ascii字母,数字和连字符之外的所有内容:从the python regular expression documentation:
使用Python 3.5中的re.sub轻松实现
示例
解释
在regular expressions(正则表达式)中,
|
是逻辑OR和\
转义空格和特殊字符,可能是实际的正则表达式命令 .sub
代表替代 .字符串在Python中是不可变的 .
replace
方法在替换后返回一个新字符串 . 尝试:我很惊讶没有人建议使用内置的 filter 功能 .
假设我们要过滤掉所有不是数字的东西 . 使用过滤器内置方法"...is equivalent to the generator expression (item for item in iterable if function(item))" [Python 3 Builtins: Filter]
在Python 3中,这将返回
要获得打印的字符串,
我不确定 filter 在效率方面是如何排名的,但是在做列表推导等时知道如何使用是一件好事 .
UPDATE
从逻辑上讲,由于过滤器的工作原理,你也可以使用列表理解,从我所读到的它应该更有效率,因为lambdas是编程功能世界的华尔街对冲基金经理 . 另一个优点是它是一个不需要任何进口的单线程 . 例如,使用上面定义的相同字符串's',
而已 . 返回将是原始字符串中所有字符的字符串 .
如果您有可接受/不可接受字符的特定列表,则只需调整列表推导的“if”部分 .
或者,
使用filter,你只需要一行
这对待了string as a iterable,如果
lambda
返回True
,则检查每个字符:过滤(...)
filter(function或None,sequence) - > list,tuple或string
返回函数(item)为true的序列项 . 如果
function为None,返回true的项 . 如果序列是一个元组
或字符串,返回相同的类型,否则返回一个列表 .
这是我的Python 2/3兼容版本 . 由于翻译api已经改变 .
以下是实现此任务的一些可能方法:
PS:相反使用“? . !/;:”这些例子使用元音...是的,“murcielago”是西班牙语中的蝙蝠...有趣的单词,因为它包含所有的元音:)
PS2:如果您对性能感兴趣,可以使用以下简单代码测量这些尝试:
在我的盒子里你会得到:
所以看起来try4是这个特定输入中最快的一个 .
这个怎么样:
您还可以使用函数来使用列表替换不同类型的正则表达式或其他模式 . 有了它,您可以混合正则表达式,字符类和真正基本的文本模式 . 当你需要替换像HTML这样的很多元素时,这非常有用 .
在函数string_cleanup中,它将您的字符串x和您的列表作为参数不需要 . 对于元素或模式列表中的每个项目,如果需要替换,则将完成 .
输出:
我使用的方法可能不会有效,但它非常简单 . 我可以使用切片和格式化一次删除不同位置的多个字符 . 这是一个例子:
这将导致'删除'持有'this'这个词 .
Formatting 对于在打印字符串中途打印变量非常有用 . 它可以使用 % 后跟变量的数据类型插入任何数据类型;所有数据类型都可以使用 %s ,浮点数(也就是小数)和整数可以使用 %d .
Slicing 可用于对字符串的复杂控制 . 当我输入 words[:3] 时,它允许我从头开始选择字符串中的所有字符(冒号在数字之前,这意味着'from the beginning to')到第4个字符(它包括第4个字符) . 原因3等于直到第4位是因为Python从0开始 . 然后,当我输入 word[-1:] 时,它表示结尾的第二个最后一个字符(冒号位于数字后面) . 设置-1会使Python从最后一个字符开始计数,而不是第一个字符 . 同样,Python将从0开始 . 因此, word[-1:] 基本上意味着'从第二个字符到字符串结尾 .
因此,通过在我要移除的角色之前切掉角色,然后将角色夹在一起,我可以删除不需要的角色 . Think of it like a sausage. 在中间它很脏,所以我想摆脱它 . 我只是切断了我想要的两端,然后把它们放在一起,中间没有不需要的部分 .
如果我想删除多个连续的字符,我只需在[](切片部分)中移动数字 . 或者如果我想从不同的位置删除多个字符,我可以简单地将多个切片夹在一起 .
例子:
removed 等于'cool' .
removed 等于'macs' .
在这种情况下, [3:5] 表示 position 3处的字符到 position 5处的字符(不包括最终位置处的字符) .
请记住,Python从0开始计数,因此您也需要 .
你必须重新分配你的str变量:
下面一个..没有使用正则表达式概念..
在Python 3.5中
例如 . ,
从字符串中删除所有数字
你可以用套装
试试这个:
这种方法在python 3.5.2中运行良好
递归拆分:s = string; chars =要删除的字符
例:
即使是以下方法也适用
输出>> abcde