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

在python中过滤字符串中的字符。(如果字符在string2中,请从string1中筛选它们),python,string,character,filtering,Python,String,Character,Filtering,我对这段代码一直有语法问题。我在if语句行中得到一个语法错误。这段代码的目的是过滤掉字符串2中的字符,并在没有这些字符的情况下重新打印字符串1。我认为我写出来的逻辑是正确的(for循环检查字符是否在两个字符串中,然后使用if语句从string2中过滤掉这些字符)。但我真的很差劲,所以我可能做错了什么 def filter_string(str1, str2): newstr = "" for c in str1 and str2: if c == str1 an

我对这段代码一直有语法问题。我在if语句行中得到一个语法错误。这段代码的目的是过滤掉字符串2中的字符,并在没有这些字符的情况下重新打印字符串1。我认为我写出来的逻辑是正确的(for循环检查字符是否在两个字符串中,然后使用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

谢谢你的帮助

下面是我在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

因此,对于这个简单的示例,translate甚至比regex更快。

以下是我在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

因此,对于这个简单的示例,translate甚至比regex更快。

非常接近您最初的尝试:

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", "(*&)")
注意:这不是非常有效,因为您正在创建一个列表来存储与remove iterable不匹配的新字符串的字符列表,并最终通过将
结果
列表与空字符串连接来返回新字符串

更好的方法是简单地使用
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倍。

与最初的尝试相当接近:

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", "(*&)")
注意:这不是非常有效,因为您正在创建一个列表来存储与remove iterable不匹配的新字符串的字符列表,并最终通过将
结果
列表与空字符串连接来返回新字符串

更好的方法是简单地使用
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倍。

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

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

return newstr

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

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

return newstr

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

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

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

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

python有很多类似于英语的结构,但你不能只是构造随机的句子,然后期望它们做你想做的事情。上面有很多错误都是由以下原因引起的:
对于str1和str2中的c:
如果c==str1和!=str2:
就是这样的两个例子。我建议打开一个python教程,从头开始——花式的
str.translate
''。join(gen expression)
答案不会教你很多东西。python有很多类似英语的结构,但你不能只是构造随机的句子,并期望它们做你想做的事情。上面有很多错误都是由以下原因引起的:
对于str1和str2中的c:
如果c==str1和!=str2:
就是这样的两个例子。我建议打开一个python教程,从头开始-fancy
str.translate
''。join(gen expression)
答案不会教你太多。你能不能将
remove
转换成一个集合,使用列表理解并比较结果?看起来这个集合将是一个非常小的改进,另外,您还需要克服转换为set所需的相对较长的时间-
>>timeit.timeit('i'在alpha中),setup=“alpha=set('abcdefghi')”)0.04773922599270085>>timeit.timeit('i'在alpha中,setup=“alpha='abcdefghi'))0.057853144011460245
我知道内置的
str.translate
会更快,因为底层的实现是C/CPython。你能不能将
remove
转换成一个集合,使用列表理解并比较结果?看起来这个集合会有很小的改进,另外,您还需要克服转换为set所需的相对较长的时间-
>>timeit.timeit('i'在alpha中),setup=“alpha=set('abcdefghi')”)0.04773922599270085>>timeit.timeit('i'在alpha中,setup=“alpha='abcdefghi'))0.057853144011460245
我知道一个事实,即内置的
str.translate
将更快,因为底层实现将使用C/CPython。非常感谢。没有考虑只是安排,如果这样,非常感谢。没有考虑只是安排,如果这样的话。