Python:如何从第i个到第j个匹配替换字符?

时间:2017-09-08 14:33:05

标签: python regex

例如,如果我有:

"+----+----+---+---+--+"

可以从第二个到第四个+替换为-吗?

如果我有

"+----+----+---+---+--+"

我希望

"+-----------------+--+"

我必须从第2个+替换为-self.model.set('pristineMethod', { pristineMethod : utils.cloneDeep(self.model.get())} ); 。是否有可能通过正则表达式实现这一目标?怎么样?

6 个答案:

答案 0 :(得分:5)

如果您认为第一个字符始终为+

string = '+' + re.sub(r'\+', r'-', string[1:], count=3)

删掉字符串的第一个字符,然后sub()前三个+字符,然后重新添加初始+

如果您不能假设第一个+是字符串的第一个字符,请先找到它:

prefix = string.index('+') + 1
string = string[:prefix] + re.sub(r'\+', r'-', string[prefix:], count=3)

答案 1 :(得分:2)

我宁愿迭代字符串,然后根据我发现的内容替换字符串。

secondIndex = 0
fourthIndex = 0
count = 0
for i, c in enumerate(string):
    if c == '+':
        count += 1
    if count == 2 and secondIndex == 0:
        secondIndex = i
    elif count == 4 and fourthIndex == 0:
        fourthIndex = i

string = string[:secondIndex] + '-'*(fourthIndex-secondIndex+1) + string[fourthIndex+1:]

测试:

+----+----+---+---+--+
+-----------------+--+

答案 2 :(得分:2)

我将字符串拆分为一个字符串数组,使用要替换的字符作为分隔符。

然后使用所需的分隔符分段重新加入数组。

example_str="+----+----+---+---+--+"

swap_char="+"
repl_char='-'
ith_match=2
jth_match=4

list_of_strings = example_str.split(swap_char)

new_string = ( swap_char.join(list_of_strings[0:ith_match]) + repl_char +
               repl_char.join(list_of_strings[ith_match:jth_match]) +
               swap_char + swap_char.join(list_of_strings[jth_match:]) )

print (example_str)
print (new_string)

运行它给出:

$ python ./python_example.py
+----+----+---+---+--+
+-------------+---+--+

答案 3 :(得分:2)

正则表达式?是的,这是可能的。

^(\+-+){1}((?:\+[^+]+){3})

<强>解释

^
(\+-+){1}                  # read + and some -'s until 2nd +
(                          # group 2 start
(?:\+[^+]+){3}             # read +, followed by non-plus'es, in total 3 times
)                          # group 2 end

<强>测试

$ cat test.py
import re

pattern = r"^(\+-+){1}((?:\+[^+]+){3})"

tests = ["+----+----+---+---+--+"]

for test in tests:
    m = re.search(pattern, test)
    if m:
        print (test[0:m.start(2)] + 
               "-" * (m.end(2) - m.start(2)) +
               test[m.end(2):])

调整很简单:

^(\+-+){1}((?:\+[^+]+){3})
        ^              ^
  • '1'表示您正在阅读第二个'+'
  • '3'表示您正在阅读第4个'+'
  • 这些是您需要进行的唯一2次更改,组号保持不变。

运行

$ python test.py
+-----------------+--+

答案 4 :(得分:1)

仅使用理解列表:

s1="+----+----+---+---+--+"
indexes = [i for i,x in enumerate(s1) if x=='+'][1:4]
s2 = ''.join([e if i not in indexes else '-' for i,e in enumerate(s1)])

print(s2)
+-----------------+--+

我看到你已经找到了一个解决方案,但我不喜欢正则表达式,所以也许这会有助于另一个! : - )

答案 5 :(得分:1)

这是pythonic。

import re
s = "+----+----+---+---+--+"
idx = [ i.start() for i in re.finditer('\+', s) ][1:-2]
''.join([ j if i not in idx else '-' for i,j in enumerate(s) ])

但是,如果你的字符串是常量并希望它简单

print (s)
print ('+' + re.sub('\+---', '----', s)[1:])

输出:

+----+----+---+---+--+
+-----------------+--+