从python中的字符串过滤字符。 (如果字符在string2中,则从string1过滤它们)

时间:2014-03-13 02:50:25

标签: python string character filtering

我的代码存在语法问题。我在if语句行上遇到语法错误。此代码的目的是过滤掉字符串2中的字符,并在没有它们的情况下重新打印字符串1。我认为我的逻辑在我如何写出来是正确的(循环检查字符是否在两个字符串中,然后是if语句来过滤掉string2中的那些字符)。但我真的很蹩脚,所以我可能做错了什么。

def filter_string(str1, str2):
    newstr = ""

    for c in str1 and str2:
        if c == str1 and != str2:
            newstr += newstr + c
            break
    return newstr

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

以下是我在Python 2中的表现:

def filter_string(s, remove):
    '''given a string, s, remove characters in string, remove'''
    return s.translate(None, remove)

如果您使用的是Python 3:

def filter_string(s, remove):
    return s.translate(str.maketrans('','',remove))

或者如果你想要兼容Python版本:

import re
def filter_string(s, remove):
    return re.sub('[' + remove + ']', '', s)

无论哪种方式,这里都是用法:

>>> filter_string('foo (*& bar', '&(*')
'foo  bar'

这是我的机器上的Python 3的时间:

import timeit

setup = """
def filter_string_1(s, remove):
    return s.translate(str.maketrans('','',remove))

import re
def filter_string_2(s, remove):
    return re.sub('[' + remove + ']', '', s)
"""

timeit.timeit("filter_string_1('foo (*& bar', '&(*')", setup)
timeit.timeit("filter_string_2('foo (*& bar', '&(*')", setup)

对我来说回报:

1.6555187609919813
2.7981851549993735

因此,对于这个简单的例子,翻译甚至比正则表达式更快。<​​/ p>

答案 1 :(得分:1)

如果您想要与第一次尝试非常相似的东西,这将有效:

def filter_string(str1, str2):
newstr = ''
for c in str1: 
    if c not in str2:
        print c
        newstr += c

return newstr

答案 2 :(得分:0)

完全坚持你最初的尝试:

def filter_string(s, remove):
    result = []

    for c in s:
        if c not in remove:
            result.append(c)

    return "".join(result)

print filter_string("foo (*& bar", "(*&)")

注意:这并不是非常有效,因为您正在创建一个列表来存储新字符串的字符列表,该字符串与删除的可迭代字符串不匹配最后通过使用空字符串加入result列表来返回一个新字符串。

更好的方法是简单地使用str.translate()方法:

>>> "foo (*& bar".translate(None, "(*&)")
'foo  bar'

这里有两种方法之间的性能比较:

$ python -m timeit -s "from foo import filter_string" "filter_string('foo (*& bar', '(&*)')"
foo  bar
100000 loops, best of 3: 2.32 usec per loop

$ python -m timeit "'foo (*& bar'.translate(None, '(*&)')"
1000000 loops, best of 3: 0.265 usec per loop

后一种方法的速度提高了约10倍。

答案 3 :(得分:0)

当然有多种方法可以做到这一点。就个人而言,这是最简单的逻辑:

def filter_string(str1, str2):
    str3=''
    for c in str1:
        if c not in str2:
        str3+=c
    return (str3)