是否可以忽略 replace() 引号中的字符串?

Is it possible to ignore string in quotes for replace()?

是否可以忽略 python replace() 引号中的字符串? 我有一个像这样的字符串变量:

a = "I like bananas 'I like bananas'"

我想通过 replace():

得到这样的结果
"I like apples 'I like bananas'".

但是当我执行print(a.replace("bananas", "apples"))时,结果是:

"I like apples 'I like apples'".

如何使 replace() 忽略引号中的字符串?

用'拆分字符串,只处理数组的奇数元素,重新组合字符串

a = "I like bananas 'I like bananas'"
ap = a.split("'")
ar = [ ai.replace("bananas", "apples")  if i%2==0 else ai for i,ai in enumerate(ap)]
print("'".join(ar))

不,这是不可能的,你不能让 replace 忽略那些匹配项。您必须编写自己的解决方案。

您可以使用 count 值(replace 方法的可选参数)来指定要替换旧值的次数。 两者都适用。

a = "I like bananas \"I like bananas\""
print(a.replace("bananas", "apples",1))

a = "I like bananas 'I like bananas'" 
print(a.replace("bananas", "apples",1))

输出:

I like apples 'I like bananas'

这是正则表达式示例:

import re

text = "I like bananas 'I like bananas' 'I like also bananas'"

def replace2(orginal_text, b, c):
    pattern = re.compile(r".*? (\'.*?\')") # patternt to match text inside single quotes
    matches = []
    for match in pattern.findall(orginal_text): # match with pattern as many times pattern is found
        matches.append(match)
    for match in matches:
        replace_with = match.replace(b, c) # replace b with c in matched string
        orginal_text = re.sub(match, replace_with, orginal_text) # replace matched text with new string
    return orginal_text

result = replace2(text, "bananas", "apples")
print(result)

它将尝试查找单引号之间的所有文本。然后用匹配的新字符串 (c) 替换旧字符串 (b)。最后替换原始字符串中新编辑的匹配项。

根据您在回复 gnight 时更新的要求

a = "I like bananas 'I like \'bananas\' ' "
print (a)

给出:
我喜欢香蕉'我喜欢'bananas''
当 运行 时 \' 被转换为 ', 那就是它与
相同 a = "我喜欢香蕉'我喜欢'bananas''"

正如 gnight 所说,唯一真正的选择是只替换字符串的第一部分和最后一部分不在引号中的部分,即

a = "I like bananas 'I like \'bananas\' ' "
ap = a.split("'")
if len(ap)>0:
    ap[0]=ap[0].replace("bananas", "apples")
if len(ap)>1:
    ap[-1]=ap[-1].replace("bananas", "apples")
print("'".join(ap))

给出:
我喜欢苹果'我喜欢'bananas''

过去我写过解析器来处理 excel 使用的三重引号转义和一个状态机来跟踪引号状态,如果你最终不得不这样做的话,实现起来并不有趣。

如果你能给出更多所需输入输出的例子,它可能会有所帮助

绝对有可能,这是对这个问题的完整回答:

import re
original_str = "I like bananas 'I Love banana'  somthing  'I like banana'  I love banana ' I like babana again' "
pattern = r"('(.+?)')"
replaced_str = ''
quoted_strings = re.compile(pattern)
newstring = "foo"
x_start = 0
print("original_str = (", original_str+")\n")
for m in quoted_strings.finditer(original_str):
    print(m.span(), m.group())
    x_end, x_next = m.span() 
    w = original_str[x_start:x_end]
    w = w.replace("banana", "apple")
    replaced_str = replaced_str + w + original_str[x_end:x_next]
    x_start = x_next
print(replaced_str)

输出:

original_str = ( I like bananas 'I Love banana'  somthing  'I like banana'  I love banana ' I like babana again' )

(15, 30) 'I Love banana'
(42, 57) 'I like banana'
(73, 95) ' I like babana again'
I like apples 'I Love banana'  somthing  'I like banana'  I love apple ' I like babana again'