如何替换任意半重复字符串(Python)

时间:2018-01-05 12:07:49

标签: regex string python-3.x

如何查找/替换以下字符串: "< some_string> S< char 1> S< char 2> -S< char 2> S< char 1><一些字符串2>"?

这里我们使用符号<炭>作为一些任意的角色。例如,我可能想要替换" aSxSy-SySxb"用" aCOMb"。我已经阅读过群组,但这种方法似乎没有做到这一点,例如我尝试过:

import re

s = re.sub("S(.=\1)S(.=\2)+S\2S\1","SxSx+SySx","COM")
print(s)

我会将其打印为:

>>> SxSx+SySx

因为就我理解的群体而言它并不匹配,但它打印出来:

>>> Com

1 个答案:

答案 0 :(得分:0)

您需要使用反向引用。

要匹配您描述的模式,请尝试以下操作:

import re
s = "abcSxSy-SySxdef"
m = re.match(".*S(?P<char1>.)S(?P<char2>.)-S(?P=char2)S(?P=char1).*", s)
print(m.group(0))  # Prints "abcSxSy-SySxdef"
print(m.groups())  # Prints "('x', 'y')"

替换模式是类似的,但当然这取决于您想要替换的内容。例如,要将所有出现的char2替换为&#39; T&#39;,

print(re.sub(
    "(.*S)(?P<char1>.)S(?P<char2>.)-S(?P=char2)S(?P=char1)(.*)", 
    "\g<1>\g<2>ST-STS\g<2>\g<4>", s))  # Prints "abcSxST-STSxdef".

具体来说,您想要替换&#34; aSxSy-SySxb&#34;这样你最终会得到&#34; xCOMb&#34;。这是一种方法:

print(re.sub(
    "(.*S)(?P<char1>.)S(?P<char2>.)-S(?P=char2)S(?P=char1)(.*)",
    "\g<2>COM\g<4>",
    "aSxSy-SySxb"))  # Prints "xCOMb"