簡體   English   中英

Python 中的字符串替換列表

[英]A list of string replacements in Python

有沒有更短的方法來編寫以下代碼?

my_string = my_string.replace('A', '1')
my_string = my_string.replace('B', '2')
my_string = my_string.replace('C', '3')
my_string = my_string.replace('D', '4')
my_string = my_string.replace('E', '5')

請注意,我不需要替換那些確切的值; 我只是在尋找一種將 5+ 行變成少於 5 行的方法

看起來是使用循環的好機會:

mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
for k, v in mapping.iteritems():
    my_string = my_string.replace(k, v)

如果您不介意括號,則更快的方法是:

mapping = [ ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4'), ('E', '5') ]
for k, v in mapping:
    my_string = my_string.replace(k, v)

您可以輕松地使用 string.maketrans() 創建映射字符串以傳遞給 str.translate():

import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)

如果你想得到錯誤的答案,慢慢地,然后在循環中使用 string.replace 。 (盡管它在模式和替換之間沒有重疊的情況下確實有效。)

對於可能重疊或主題字符串較長的一般情況,請使用 re.sub:

import re

def multisub(subs, subject):
    "Simultaneously perform all substitutions on the subject string."
    pattern = '|'.join('(%s)' % re.escape(p) for p, s in subs)
    substs = [s for p, s in subs]
    replace = lambda m: substs[m.lastindex - 1]
    return re.sub(pattern, replace, subject)

>>> multisub([('hi', 'bye'), ('bye', 'hi')], 'hi and bye')
'bye and hi'

對於 1 個字符模式和 1 個或 0 個字符替換的特殊情況,請使用 string.maketrans。

還要查看str.translate() 它根據您為 Unicode 字符串提供的映射替換字符,否則必須告訴用什么替換從 chr(0) 到 chr(255) 的每個字符。

replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'}       
for key, replacement in replaceDict.items():  
  my_string = my_string.replace( key, replacement )

我認為它可能會更有效率:

mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
my_string = "".join([mapping[c] if c in mapping else c for c in my_string])

我建議使用“timeit”進行一些基准測試,以“my_string”的長度為基礎的真實案例。

您可以使用 Pandas 在一行中完成。

import pandas as pd

my_string="A B C test"

my_string =pd.DataFrame([my_string])[0].replace(["A","B","C","D","E"],['1','2','3','4','5'],regex=True)[0]

print(my_string)
'1 2 3 test'

我這樣做的一種方法是使用關聯的數組(字典)。 這是我使用正則表達式准備好在 LaTeX 中部署文件時使用的替換示例。

  import re
  def escapeTexString(string): # Returns TeX-friendly string
    rep = { # define desired replacements in this dictionary (mapping)
         '&': '\\&',
         '%': '\\%',
         '#': '\\#',
         '_': '\\_',
         '{': '\\{', # REGEX Special
         '}': '\\}', # REGEX Special
         '~': '\\char"007E{}', # LaTeX Special
         '$': '\\$', # REGEX Special
         '\\': '\\char"005C{}', # REGEX/LaTeX Special
         '^': '\\char"005E{}', # REGEX/LaTeX Special
         '"': '\\char"FF02{}'
        }
    # use these two lines to do the replacement (could be shortened to one line)
    pattern = re.compile("|".join(map(re.escape,rep.keys()))) # Create single pattern object (key to simultaneous replacement)
    new_string = pattern.sub(lambda match: rep[match.group(0)], string)
    return new_string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM