Python替换,使用数组中的模式

3 python regex arrays replace

我需要使用数组替换字符串中的一些东西,它们看起来像这样:

array = [3, "$x" , "$y", "$hi_buddy"]
#the first number is number of things in array
string = "$xena is here $x and $y."
Run Code Online (Sandbox Code Playgroud)

我有另外一个数组有东西来替换那些东西,让我们说它叫做rep_array.

rep_array = [3, "A", "B", "C"]
Run Code Online (Sandbox Code Playgroud)

对于替换我使用这个:

for x in range (1, array[0] + 1):
  string = string.replace(array[x], rep_array[x])
Run Code Online (Sandbox Code Playgroud)

但结果是:

string = "Aena is here A and B."
Run Code Online (Sandbox Code Playgroud)

但是我需要的只是孤独的$ x而不是$ x.结果应如下所示:

string = "$xena is here A and B."
Run Code Online (Sandbox Code Playgroud)

注意:

  • array开始的所有模式$.
  • 如果匹配整个单词后$,模式匹配; $xena不匹配$x,但foo$x 匹配.
  • $可以转义,@而不应该匹配(例如$x不匹配@$x)

zmo*_*zmo 5

这不是你问题的直接答案,但正如我猜你会得到其他解决方案\b,我会建议你一个更加pythonic的解决方案:

rep_dict = {'x': 'A', 'y': 'B', 'hi_buddy': 'C'}
string = '{xena} is here {x} and {y}'

print string.format(rep_dict)
Run Code Online (Sandbox Code Playgroud)

但是在这里,它会引发一个KeyError缺失的xena in rep_dict,这可以通过回答这个问题来解决,使用defaultdict你可能更喜欢的格式化程序,具体取决于你的用例.

使用的问题$在于,制作与未定义真实边界相匹配的东西并非易事.大多数使用$变量的语言将它应用于下一个字符,使用较大字符(即shell和makefile)的边界,即${xena}.像Perl这样的语言使用语法来定义$变量的上下文,我猜他们也可以在tokenizer中使用regexp.

这就是为什么在python中,我们只使用格式化运算符来标记{}字符串中变量的边界,没有用处,$所以我们不必处理歧义($xena => ${x}ena or ${xena}?).

HTH