Python 在字符串中有选择地替换子字符串

Python 在字符串中有选择地替换子字符串,python,Python,我有这样一个字符串: a = "\"java jobs in delhi\" delhi" "\"java jobs in delhi\"" 我想用“”替换德里。但只有德里在双引号之外。因此,输出应如下所示: a = "\"java jobs in delhi\" delhi" "\"java jobs in delhi\"" 字符串是示例字符串。子字符串不一定是“德里”。要替换的子字符串可以出现在输入字符串中的任何位置。字符串中带引号和不带引号部分的顺序和数量不是固定的 .replac

我有这样一个字符串:

a = "\"java jobs in delhi\" delhi"
"\"java jobs in delhi\""
我想用“”替换德里。但只有德里在双引号之外。因此,输出应如下所示:

a = "\"java jobs in delhi\" delhi"
"\"java jobs in delhi\""
字符串是示例字符串。子字符串不一定是“德里”。要替换的子字符串可以出现在输入字符串中的任何位置。字符串中带引号和不带引号部分的顺序和数量不是固定的


.replace()
替换两个子字符串。我也不能使用
rstrip
,因为它不一定会出现在字符串的末尾。我该怎么做?

使用
re.sub

>>> a = "\"java jobs in delhi\" delhi"
>>> re.sub(r'\bdelhi\b(?=(?:"[^"]*"|[^"])*$)', r'', a)
'"java jobs in delhi" '
>>> re.sub(r'\bdelhi\b(?=(?:"[^"]*"|[^"])*$)', r'', a).strip()
'"java jobs in delhi"'

>>> re.sub(r'("[^"]*")|delhi', lambda m: m.group(1) if m.group(1) else "", a)
'"java jobs in delhi" '
>>> re.sub(r'("[^"]*")|delhi', lambda m: m.group(1) if m.group(1) else "", a).strip()
'"java jobs in delhi"'

通常,您可以使用
re.split
和列表理解:

>>> a = "\"java jobs in delhi\" delhi \"another text\" and this"
>>> sp=re.split(r'(\"[^"]*?\")',a)
>>> ''.join([i.replace('dehli','') if '"' in i else i for i in sp])
'"java jobs in delhi" delhi "another text" and this'
re.split()
函数根据被
包围的子字符串分割文本:


然后,您可以替换没有用两个双引号括起来的
dehli
单词。

这里是另一种替代方法。这是一种删除任何未加引号文本的通用解决方案:

def only_quoted_text(text):
    output = []
    in_quotes=False

    for letter in a:
        if letter == '"':
            in_quotes = not in_quotes
            output.append(letter)
        elif in_quotes:
            output.append(letter)

    return "".join(output)  


a = "list of \"java jobs in delhi\" delhi and \" python jobs in mumbai \" mumbai"

print only_quoted_text(a)
产出将是:

"java jobs in delhi"" python jobs in mumbai "

如果缺少最后的引号,它也会显示文本。

您想多次执行此操作,还是只执行一次?因为您可以通过执行[0:-6]来选择子字符串。您考虑过正则表达式吗?这只是一个示例字符串。我觉得正则表达式是可行的,但我无法为此生成正则表达式。该字符串可能类似于
”\pune中的java作业\“pune”
。因此,我基本上是在寻找一个通用的解决方案。您想删除第三个
之后的所有内容吗?名称是否总是出现在字符串/行的末尾,或者也可以出现在它之前?