How to remove specific substrings from a set of strings in Python?

后端 未结 10 1909
自闭症患者
自闭症患者 2020-12-07 12:08

I have a set of strings set1, and all the strings in set1 have a two specific substrings which I don\'t need and want to remove.
Sample Input

相关标签:
10条回答
  • 2020-12-07 12:21
    >>> x = 'Pear.good'
    >>> y = x.replace('.good','')
    >>> y
    'Pear'
    >>> x
    'Pear.good'
    

    .replace doesn't change the string, it returns a copy of the string with the replacement. You can't change the string directly because strings are immutable.

    You need to take the return values from x.replace and put them in a new set.

    0 讨论(0)
  • 2020-12-07 12:21
    # practices 2
    str = "Amin Is A Good Programmer"
    new_set = str.replace('Good', '')
    print(new_set)
    
     
    
    print : Amin Is A  Programmer
    
    0 讨论(0)
  • 2020-12-07 12:25

    Update for Python 3.9

    In python 3.9 you could remove suffix using str.removesuffix('suffix')

    From the docs,

    If the string ends with the suffix string and that suffix is not empty, return string[:-len(suffix)]. Otherwise, return a copy of the original string:

    set1  = {'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
    
    set2 = set()
    
    for s in set1:
       set2.add(s.removesuffix(".good").removesuffix(".bad"))
    

    or using set comprehension:

    set2 = {s.removesuffix(".good").removesuffix(".bad") for s in set1}
       
    print(set2)
    
    
    Output:
    {'Orange', 'Pear', 'Apple', 'Banana', 'Potato'}
    
    0 讨论(0)
  • 2020-12-07 12:26

    If list

    I was doing something for a list which is a set of strings and you want to remove all lines that have a certain substring you can do this

    import re
    def RemoveInList(sub,LinSplitUnOr):
        indices = [i for i, x in enumerate(LinSplitUnOr) if re.search(sub, x)]
        A = [i for j, i in enumerate(LinSplitUnOr) if j not in indices]
        return A
    

    where sub is a patter that you do not wish to have in a list of lines LinSplitUnOr

    for example

    A=['Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad']
    sub = 'good'
    A=RemoveInList(sub,A)
    

    Then A will be

    0 讨论(0)
  • 2020-12-07 12:27

    When there are multiple substrings to remove, one simple and effective option is to use re.sub with a compiled pattern that involves joining all the substrings-to-remove using the regex OR (|) pipe.

    import re
    
    to_remove = ['.good', '.bad']
    strings = ['Apple.good','Orange.good','Pear.bad']
    
    p = re.compile('|'.join(map(re.escape, to_remove))) # escape to handle metachars
    [p.sub('', s) for s in strings]
    # ['Apple', 'Orange', 'Pear']
    
    0 讨论(0)
  • 2020-12-07 12:33

    Strings are immutable. string.replace (python 2.x) or str.replace (python 3.x) creates a new string. This is stated in the documentation:

    Return a copy of string s with all occurrences of substring old replaced by new. ...

    This means you have to re-allocate the set or re-populate it (re-allocating is easier with set comprehension):

    new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}
    
    0 讨论(0)
提交回复
热议问题