在一次运行中替换字符串中的所有字符

时间:2017-10-06 05:27:42

标签: python string dictionary

我试图通过将字符串拆分为一个字符串并迭代它来替换字符串中的字符。

我为所有需要用值替换的键创建了一个字典。

dicta = {
    "eq" : "=",
    "gt" : ">",
    "lt" : "<"
}

s = "name eq 'alex' and age gt 36"
[s.replace(char, dicta.get(char)) for char in s.split(" ") if char in dicta ]

以上解决方案为我提供了输出:

["name = 'alex' and age gt 36", "name eq 'alex' and age > 36"]

这是因为我在一次更改char后创建了整个字符串。

预期输出: ["name = 'alex' and age > 36"]

我怎样才能一次性完成?

5 个答案:

答案 0 :(得分:1)

尝试reduce

from functools import reduce

dict = {
    "eq" : "=",
    "gt" : ">",
    "lt" : "<"
}

s = "name eq 'alex' and age gt 36"


reduce(lambda x, y: x.replace(y, dict[y]), dict, s)

答案 1 :(得分:1)

正则表达式解决方案:(这也将替换eqequality=uality等其他字词替换的键:import re dicta = { "eq" : "=", "gt" : ">", "lt" : "<" } s = "name eq 'alex' and age gt 36 equality" # pattern that matches every key in dicta with white space around it pattern = '|'.join(dicta.keys()) ans = re.sub(pattern, lambda x : dicta.get(x.group(0)), s) print(ans)

dicta = {
    "eq" : "=",
    "gt" : ">",
    "lt" : "<"
}

s = "name eq 'alex' and age gt 36 equality"   
ans = ' '.join([dicta.get(word, word)for word in s.split()])

print(ans)

编辑: 这是一种拆分和连接方法:(这将用单个空格替换单词之间的多个空格)

from IPython import display, HTML
def show_audio_with_controls(file_path):
    display(HTML("<audio controls><source src={} type='audio/mpeg'></audio>".format(file_path)))

答案 2 :(得分:1)

以下示例替换了operator关键字的所有实例。它还确保忽略诸如权益之类的嵌入词。

dicta = {
    "eq" : "=",
    "gt" : ">",
    "lt" : "<"
}

s = "name eq 'alex' and age gt 36"

words = s.split(" ")
result = []
for w in words:
    result.append(dicta.get(w,w))

print(" ".join(result))

答案 3 :(得分:1)

使用正则表达式和\b来匹配单词边界,这将避免替换单词相等。

正则表达式匹配单词,如果键中的键不匹配,则返回相同的单词。

dicta = {
    "eq" : "=",
    "gt" : ">",
    "lt" : "<"
}

s = "name eq 'alex' and age gt 36"

import re


ans = re.sub(r'\b({})\b'.format('|'.join(dicta.keys())), lambda x : dicta.get(x.group(0), x.group(0)), s)
### can try regex below also
# ans = re.sub(r'\b(\w+)\b', lambda x : dicta.get(x.group(0), x.group(0)), s)

# "name = 'alex' and age > 36"

答案 4 :(得分:0)

我认为,您的代码问题如下:

>>> s="name eq"
>>> s.replace('eq','=')
'name ='
>>> s.replace('name','Name')
'Name eq'
>>>

您必须保存第一个替换品并将其用于第二次更换。

代码:

dicta = {
    "eq" : "=",
    "gt" : ">",
    "lt" : "<"
}

s = "name eq 'alex' and age gt 36"

d= s.split(" ")
for char in s.split(" "):
    if char in dicta.keys():
        s = s.replace(str(char), str(dicta.get(char)))
print s

<强>输出:

"C:\Program Files (x86)\Python27\python.exe" C:/Users/punddin/PycharmProjects/demo/demo.py
name = 'alex' and age > 36