php's strtr for python

后端 未结 5 934
遇见更好的自我
遇见更好的自我 2020-12-06 18:39

php has the strtr function:

strtr(\'aa-bb-cc\', array(\'aa\' => \'bbz\', \'bb\' => \'x\', \'cc\' => \'y\'));
# bbz-x-y

It replace

相关标签:
5条回答
  • 2020-12-06 18:55

    str.translate is the equivalent, but can only map to single characters.

    0 讨论(0)
  • 2020-12-06 18:58
    def strtr(strng, replace):
        if replace and strng:
            s, r = replace.popitem()
            return r.join(strtr(subs, dict(replace)) for subs in strng.split(s))
        return strng
    
    j=strtr('aa-bb-cc', {'aa': 'bbz', 'bb': 'x', 'cc': 'y'})
    assert j=='bbz-x-y', j
    
    0 讨论(0)
  • 2020-12-06 19:07

    The answers on this thread are so out-dated. Here we go...

    Option #1: Use the str.format() function to handle this:

    "Hello there {first_name} {last_name}".format(first_name="Bob", last_name="Roy")
    

    Option #2: Use the Template class

    from string import Template
    t = Template('Hello there $first_name $last_name')
    t.substitute(first_name="Bob", last_name="Roy")
    

    Reference: Python String Formatting Best Practices

    0 讨论(0)
  • 2020-12-06 19:16

    Here is a naive algorithm:

    Use an index to walk the original string character by character and check for each index whether one of the search strings is equal to the string from the current index on. If a match is found, push the replacement in a buffer and proceed the index by the length of the matched string. If no match is found, proceed the index by one. At the end, concatenate the strings in the buffer to a single string.

    def strtr(strng, replace):
        buffer = []
        i, n = 0, len(strng)
        while i < n:
            match = False
            for s, r in replace.items():
                if strng[i:len(s)+i] == s:
                    buffer.append(r)
                    i = i + len(s)
                    match = True
                    break
            if not match:
                buffer.append(strng[i])
                i = i + 1
        return ''.join(buffer)
    
    0 讨论(0)
  • 2020-12-06 19:17

    The following uses regular expressions to do it:

    import re
    
    def strtr(s, repl):
      pattern = '|'.join(map(re.escape, sorted(repl, key=len, reverse=True)))
      return re.sub(pattern, lambda m: repl[m.group()], s)
    
    print(strtr('aa-bb-cc', {'aa': 'bbz', 'bb': 'x', 'cc': 'y'}))
    

    Like the PHP's version, this gives preference to longer matches.

    0 讨论(0)
提交回复
热议问题