Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中字符串替换的列表_Python_String_Replace - Fatal编程技术网

Python中字符串替换的列表

Python中字符串替换的列表,python,string,replace,Python,String,Replace,有没有一种短得多的方法来编写下面的代码 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

有没有一种短得多的方法来编写下面的代码

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行的替换dict={'a':'1','B':'2','C':'3','D':'4','E':'5'} replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'} for key, replacement in replaceDict.items(): my_string = my_string.replace( key, replacement ) 对于键,在replaceDict.items()中替换:
my_string=my_string.replace(key,replacement)看起来是使用循环的好机会:

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)

也调查一下。它根据您为Unicode字符串提供的映射来替换字符,或者必须告知如何将从chr(0)到chr(255)的每个字符替换为。

您可以轻松使用string.maketrans()创建要传递到str.translate()的映射字符串:


如果您想得到错误的答案,请慢慢地,然后在循环中使用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。

一种方法是使用关联数组(字典)。下面是一个使用正则表达式准备在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

我认为它可以更高效一些:

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'

这很奇怪;我就是这样写的,因为问题是从一个字符映射到另一个字符。但事实上,你并没有把口述当作口述;您将其用作元组列表。那么,为什么不首先编写一个元组列表呢?当然,元组列表也可以工作(而且速度更快)。我将编辑答案以包含该选项。如果您将使用此映射{'A':'1','1':'A'},结果可能与预期的不一样。对于Python3,更简洁地定义
mapping=zip(list('ABCDE'),range(1,6))
的方法是使用
.items()
而不是
.iterms()
+1,-1表示
string.replace
给出了错误的答案,因为不清楚重叠匹配应该发生什么。所以net0:)str.replace可能给出一个可能是错误的答案。对于基于字典的解决方案,考虑字符串“哇”和翻译表{ w’:“fo”,“o”:“bar”}。根据dict的迭代顺序,您可以得到不同的结果:“fbarbarfbarbar”或“foobarfoo”。一个为相同的输入提供不同输出的函数可以说是被破坏了。迈尔斯,是的,这就是我所说的那种问题。您也可能单独在键中遇到重叠,如“hello”和“hell”。这很好,但在多字符模式或replacementsCorrect的情况下不起作用。我从问题中假设这是基于字符的替换。这实际上是同时替换字符列表的唯一正确方法。例如,如果在Python3中执行
'.replace(''>').replace('>',它就是str.maketrans(“ABCDE”,“12345”)请在发布之前阅读其他答案。你的答案与Darius 8年前的答案完全相同。在我看来,如果你同时有多个替换项,并且替换项不总是单个字符,这是最好的解决方案。
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'