【问题标题】:Add text between strings as needed根据需要在字符串之间添加文本
【发布时间】:2018-04-06 04:27:52
【问题描述】:

我想要在同一字符串的两次出现之间替换文本,如下所示:

Input:- "abcdefghcd","cd","k"
Output :- "abkefghk" 

您可能认为像 .replace() 这样简单的事情会起作用,但实际上并非如此。更多示例 -

Input:- "123*45","*","u"
Output:- "123*45" # No change because there aren't two occurences of "*"

Input:- "text*text*hello*text","*","k"
Output:- "textktextkhello*text"

我不知道该怎么做。有任何想法吗?

【问题讨论】:

  • @KlausD。我一直在用替换做东西,还计算了子字符串的出现次数。但是我的代码变得足够复杂,也没有给出预期的结果。

标签: python regex string python-3.x


【解决方案1】:

计算出现次数,如果 n 为奇数,则仅替换前 n-1 个。

>>> s, find, replace = "text*text*hello*text", "*", "k"
>>> s.replace(find, replace, 2*(s.count(find)//2))
'textktextkhello*text'

【讨论】:

    【解决方案2】:

    拆分和加入怎么样:

    Input = "abcdefghcd"
    replace_="cd"
    with_='k'
    
    
    data=Input.split(replace_)
    print(with_.join(data))
    

    输出:

    abkefghk
    

    【讨论】:

    • 这是个好主意,但它只适用于第一种情况。
    【解决方案3】:

    如果找到超过 2 个匹配项,则拆分字符串并仅替换模式。

    >>> replace = lambda s, pat, sub: "".join([x + sub for x in s.split(pat) if x]) if len(s.split(pat))>2 else s
    >>> replace("abcdefghcd", "cd", "k")
    'abkefghk'
    >>> replace("123*45", "*", "u")
    '123*45'
    

    如果您喜欢显式函数(推荐)而不是单行:

    def replace(s, pat, sub, occ=2):
        """Return a string of replaced letters unless below the occurrences."""
        if len(s.split(pat)) > occ:
            return "".join([x + sub for x in s.split(pat) if x]) 
        return s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2020-11-30
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多