我有一个字符串列表,如'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'的出现次数可能会有所不同。
答案 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]