Python正则表达式:替换字符串中每个第二个出现的匹配项

6

我有一个包含数据的字符串,它看起来像这样:

str1 = "[2.4],[5],[2.54],[4],[3.36],[4.46],[3.36],[4],[3.63],[4.86],[4],[4.63]"

我想要用","替换每隔一个"],["的迭代,使其看起来像这样:
str2 = "[2.4,5],[2.54,4],[3.36,4.46],[3.36,4],[3.63,4.86],[4,4.63]"

以下是我目前的进展:

str1 = "[2.4],[5],[2.54],[4],[3.36],[4.46],[3.36],[4],[3.63],[4.86],[4],[4.63]"
s2 = re.sub(r"],\[", ',', str1)
print(s2)

我正在尝试玩弄这个东西:

(.*?],\[){2}

但是使用循环似乎没有给我想要的结果。我尝试使用循环,但是我只能替换第二个出现的内容,并且在使用我在这里找到的示例代码后什么都没有改变。 代码如下:here
import re

def replacenth(string, sub, wanted, n):
    where = [m.start() for m in re.finditer(sub, string)][n-1]
    before = string[:where]
    after = string[where:]
    after = after.replace(sub, wanted, 1)
    newString = before + after
    print(newString)
For these variables:

string = 'ababababababababab'
sub = 'ab'
wanted = 'CD'
n = 5

谢谢。

4个回答

5

您可以使用

import re
from itertools import count

str1 = "[2.4],[5],[2.54],[4],[3.36],[4.46],[3.36],[4],[3.63],[4.86],[4],[4.63]"
c = count(0)
print( re.sub(r"],\[", lambda x: "," if next(c) % 2 == 0 else x.group(), str1) )
# => [2.4,5],[2.54,4],[3.36,4.46],[3.36,4],[3.63,4.86],[4,4.63]

请查看Python演示

正则表达式是一样的,],\[,它匹配文本中的字面值],[

c = count(0)初始化计数器,每次在用作替换参数的lambda表达式中进行匹配时,该计数器的值会增加。当计数器是偶数时,匹配项将被替换为逗号,否则保持不变。


3
你可以捕获你想要保留的部分。
  1. (\[[^]]+) - 捕获 [ 和紧随其后但不包括下一个 ] 的所有内容
  2. ],\[ - 匹配 ],[
  3. ([^]]+) - 捕获紧随其后但不包括下一个 ] 的所有内容
>>> re.sub(r"(\[[^]]+)],\[([^]]+)", r"\1,\2", str1)
'[2.4,5],[2.54,4],[3.36,4.46],[3.36,4],[3.63,4.86],[4,4.63]'

3

这里有另一种只使用正则表达式的方法:

import re

text = '[2.4],[5],[2.54],[4],[3.36],[4.46],[3.36],[4],[3.63],[4.86],[4],[4.63]'

print(re.sub(r'],\[(.*?])', r',\1', text))

Output:

[2.4,5],[2.54,4],[3.36,4.46],[3.36,4],[3.63,4.86],[4,4.63]

1

使用itertools.cycle的Wiktor解决方案的简化版本:

c = cycle((",", "],["))
print( re.sub(r"],\[", lambda x: next(c), str1) )

c = cycle((True, False))
print( re.sub(r"],\[", lambda x: "," if next(c) else x.group(), str1) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接