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

时间:2015-07-06 10:02:02

标签: python

我有一个这样的字符串:

a = "\"java jobs in delhi\" delhi"

我想用“”取代德里。但只有德里在双引号之外。因此,输出应如下所示:

"\"java jobs in delhi\""

字符串是一个示例字符串。子字符串不一定是“delhi”。要替换的子字符串可以出现在输入字符串中的任何位置。字符串中引用和不引用部分的顺序和数量不固定

.replace()替换了两个德里子串。我不能使用rstrip因为它不一定出现在字符串的末尾。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

使用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"'

答案 1 :(得分:0)

作为一般方法,您可以使用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()功能根据"包围的子字符串拆分文字:

['', '"java jobs in delhi"', ' delhi ', '"another text"', ' and this']

然后你可以替换没有被2个双引号包围的dehli个单词!

答案 2 :(得分:0)

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

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 "

如果缺少最终报价,它也会显示文字。