Python:用变量

时间:2018-05-02 18:40:14

标签: python regex string

我有一个字符串列表,如'cdbbdbda', 'fgfghjkbd', 'cdbbd'等。我还有一个变量从另一个字符串列表中提供。我需要的是替换第一个列表的字符串中的子字符串,比如b z,只要它在变量列表中的子字符串之前,所有其他事件都被触发。 我有什么:

a = ['cdbbdbda', 'fgfghjkbd', 'cdbbd']
c = ['d', 'f', 'l']

我的所作所为:

for i in a:
    for j in c:
        if j+'b' in i:
            i = re.sub('b', 'z', i)

我需要什么:

'cdzbdzda'
'fgfghjkbd'
'cdzbd'

我得到了什么:

'cdzzdzda'
'fgfghjkbd'
'cdzzd'

'b'的所有实例都被替换。 我是新手,非常欢迎任何帮助。在Stackoverflow上寻找答案我发现很多解决方案都是基于字边界的正则表达式,或re基于str.replace的{​​{1}},但是我不能用它作为长度的字符串和'b'的出现次数可能会有所不同。

3 个答案:

答案 0 :(得分:1)

我认为如果您在查找和替换中加入func computeKernel(_ texture:MTLTexture, commandBuffer:MTLCommandBuffer) { let computeEncoder = commandBuffer.makeComputeCommandEncoder() computeEncoder?.setComputePipelineState(computePipelineState!) computeEncoder?.setTexture(texture, index: 0) computeEncoder?.setTexture(texture, index: 1) computeEncoder?.dispatchThreadgroups(threadgroupCount, threadsPerThreadgroup: threadgroupSize) computeEncoder?.endEncoding() /* commandBuffer.commit() commandBuffer.waitUntilCompleted() */ } override func draw(_ rect: CGRect) { guard let drawable = currentDrawable, let currentRenderPassDescriptor = currentRenderPassDescriptor else { return } // Set up command buffer and encoder guard let commandQueue = commandQueue else { print("Failed to create Metal command queue") return } guard let commandBuffer = commandQueue.makeCommandBuffer() else { print("Failed to create Metal command buffer") return } guard let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: currentRenderPassDescriptor) else { print("Failed to create Metal command encoder") return } commandEncoder.label = "Preview display" let texture = ... //Grab a Metal texture computeKernel(texture, commandBuffer: commandBuffer) commandEncoder.setRenderPipelineState(defaultRenderPipelineState!) commandEncoder.setFragmentTexture(texture, index: 0) commandEncoder.setVertexBytes(vertices, length: vertices.count * MemoryLayout<AAPLVertex>.stride, index: 0) commandEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4) commandEncoder.endEncoding() commandBuffer.present(drawable) // Draw to the screen commandBuffer.commit() } ,您就会得到您想要的内容。

j

我添加了>>> for i in a: ... for j in c: ... i = re.sub(j+'b', j+'z', i) ... print i ... cdzbdzda fgfghjkbd cdzbd >>> ,因为您的循环没有进行就地更改,因此如果没有输出,则无法查看已进行的替换。

答案 1 :(得分:1)

你应该只使用具有正向lookbehind断言的正则表达式。

像这样:

import re

for i in a:
  for j in c:
    i = re.sub('(?<=' + j + ')b', 'z', i)

基本情况是:

re.sub('(?<=d)b', 'z', 'cdbbdbda')

答案 2 :(得分:0)

您可以使用列表理解:

Function get-foo () {
    Get-FunctionName -StackNumber 2
}
Function get-Bar  () {
    get-foo 
}
get-Bar 
#Reutrns 'get-Bar'

输出:

import re
a = ['cdbbdbda', 'fgfghjkbd', 'cdbbd']
c = ['d', 'f', 'l']
new_a = [re.sub('|'.join('(?<={})b'.format(i) for i in c), 'z', b) for b in a]