用python中的其他东西替换泛型字符串

时间:2014-05-02 17:34:28

标签: python replace

我基本上有可能就像这样的字符串

str1 = "Z (X) Z"
str2 = "Z .X. Z"
str3 = "Z 'X' Z"

X可能是任何东西,以及Z:例如:

str1 = "(example1)         "
str2 = "random_stuff .example2. other_random_stuff"
str3 = "'example3' stuff"

我需要的是用其他东西替换X,但是如果X可以是任何东西我怎么能这样做呢?我必须推断由“..”,“()”,“''”(X部分)分隔的字符串部分,并用其他东西替换它。 Z部分也可以是任何东西,它们不应该被考虑,并且X的东西也可以在字符串的中间找到,所以我无法使用它:

str1 = ".X."
str_to_be_changed = str1[1][-1]
str1.replace(str_to_be_changed, "Y")

谢谢:)

2 个答案:

答案 0 :(得分:3)

您使用具有替换功能的正则表达式:

import re

def change_string(string, replacement):
    def repl(match):
        o, c = match.group('open'), match.group('close')
        if o + c in ('..', "''", '()'):
            return '{}{}{}'.format(o, replacement, c)
        return match.group(0)
    return re.sub(r"(?P<open>['.(]).*?(?P<close>['.)])", repl, string)

repl()函数验证开头和结束字符在替换前是否匹配。

演示:

>>> str1 = ".X."
>>> change_string(str1, 'Y')
'.Y.'
>>> change_string("This is a larger 'example' with (more than one) replacement, including a 'false positive.", 'Y')
"This is a larger 'Y' with (Y) replacement, including a 'false positive."

答案 1 :(得分:1)

尝试使用str.format()

例如:

l = ".{}."
print l.format("mything")
'.mything.'