替换字符串的一部分(如果存在于列表中)(Python)

时间:2018-06-25 14:11:25

标签: python string list replace

如果要显示在列表中,我想将字符串的一部分替换为空白。

例如:

列表

foo = ['.com', '.net', '.co', '.in']

将这些字符串转换为

google.com   
google.co.in 
google.net   
google.com/gmail/   

这些字符串

google  
google  
google  
google/gmail/

到目前为止,我已经找到了解决方案。还有其他优化方法吗?
replace item in a string if it matches an item in the list

5 个答案:

答案 0 :(得分:1)

类似于乔治·舒尔金的答案。

import re
suffixes = ['.com', '.co', '.in', '.net']
patterns = [re.compile(suffix) for suffix in suffixes]

def remove_suffixes(s: str) -> str:
    for pattern in patterns:
        s = pattern.sub("", s)
    return s

# urls = ["google.com", ...
clean_urls = map(remove_suffixes, urls)
# or clean_urls = [remove_suffixes(url) for url in urls]

您可能要使用列表推导,因为在许多情况下它可能比map快。

这样做的好处是还可以编译正则表达式,在循环中使用时可以提高性能。

或者,如果您决定使用functools.reduce

from functools import reduce

def remove_suffixes(s: str) -> str:
    return reduce(lambda s, pattern: pattern.sub("", s), patterns, s) 

答案 1 :(得分:0)

您需要将此任务分成两部分:

  1. 编写代码以在匹配时用新字符串替换字符串。
  2. 将此功能应用于列表。

首先可以使用regexp完成(请参见下文)。第二个可以通过使用map函数来完成。

替换子字符串的代码示例:

>>> import re
>>> re.sub(".com", "",  "google.com/gmail/")
'google/gmail/'

使用map函数的示例:

>>> map(lambda x: len(x), ["one", "two", "three"])
[3, 3, 5]

(它将数组元素替换为这些元素的长度)。

您可以将两者结合起来以获得想要的东西。

答案 2 :(得分:0)

使用George Shuklin的建议,这是我能想到的最简单的代码。


import re

domains = ['.com', '.net', '.co', '.in']

urls = ["google.com","google.co.in","google.net","google.com/gmail/"]

for i in range(len(urls)):
    for domain in domains:
        urls[i] = re.sub(domain,"",urls[i])

print(urls)

这将输出:

['google', 'google', 'google', 'google/gmail/']

答案 3 :(得分:0)

您可以使用re.substr.join

import re
foo = ['.com', '.net', '.co', '.in']
urls = ["google.com","google.co.in","google.net","google.com/gmail/"]
final_result = [re.sub('|'.join(foo), '', i) for i in urls]

输出:

['google', 'google', 'google', 'google/gmail/']

答案 4 :(得分:0)

另一种替代方法是使用str.replace()str.find()

foo = ['.com', '.net', '.co', '.in']
domains = ["google.com", "google.co.in", "google.net", "google.com/gmail/"]

def remove_extensions(domain, extensions):
    for ext in extensions:
        if domain.find(ext) != -1:
            domain = domain.replace(ext, "")
    return domain

list(map(lambda x: remove_extensions(x, foo), domains))

此代码段按预期输出结果:

['google', 'google', 'google', 'google/gmail/']