Esto se basa en ¿Ejecutar regexp en script PyQGIS? y Buscar y reemplazar texto en todos los campos en QGIS 3
Estoy tratando de modificar el código para permitir sustituciones más complejas utilizando regex pero no estoy seguro de cómo estructurar la función re.sub
Véase https://regex101.com/r/OX1W3b/2/ por ejemplo...
1. DIMENSIONS: | ORIGIN: | Position corrected and IL (0) was changed based on RPS: 3482 -230
2. DIMENSIONS: 2 x 1350 RCP | ORIGIN: PCD13180 | Position corrected and IL (0) was changed based on RPS: 1390 -20800/1350RCP
3. DIMENSIONS: 3 x 375 RCP | ORIGIN:
4. DIMENSIONS: | ORIGIN:
5. Review attribution | DIMENSIONS: | ORIGIN:
Donde no hay ningún valor después de DIMENSIONES u ORIGEN debe ser borrado así...
1. Position corrected and IL (0) was changed based on RPS: 3482 -230
2. DIMENSIONS: 2 x 1350 RCP | ORIGIN: PCD13180 | Position corrected and IL (0) was changed based on RPS: 1390 -20800/1350RCP
3. DIMENSIONS: 3 x 375 RCP
4.
5. Review attribution
Aquí está el código actual - ver líneas 10 y 33 para los comandos basados en regex.
#Use in QGIS 3 python console
#Search and replace text in all fields of all layers
#Also allows regex use
import re
#Based on https://gis.stackexchange.com/questions/317855/search-and-replace-text-in-all-fields-in-qgis-3
#set text to search for and replace with.
searchText = "DIM"
regexText = ".*(DIMENSIONS: \|)"
replaceText = ""
#run on all layers
layers = QgsProject.instance().mapLayers()
for layer_id, layer in layers.items():
i=1
print("Layer: %s" % (layer.name()))
# get data provider
dpr = layer.dataProvider()
for field in layer.fields():
fieldName=field.name()
for feature in layer.getFeatures():
inText = str(feature[fieldName])
# get field index
fieldIndex = layer.fields().indexFromName(fieldName)
#print ("Checking %s" % (inText))
if searchText in inText:
# change inText
print ("%s . REPLACED: %s in %s with %s in column: %s" % (i, searchText, inText, replaceText, fieldName))
#outText = inText.replace(searchText, replaceText)
outText = re.sub(fieldName, regexText, replaceText)
i+=1
# save changes
dpr.changeAttributeValues({feature.id(): {fieldIndex: outText}})
print ("Completed")
ACTUALIZAR al utilizar regexText = ".*(DIMENSIONS: )(\| ORIGIN: ?\|? ?)"
Creo que tenemos que tratar cada clave (DIMENSIONS:, ORIGIN: etc) sin valor por separado ya que hay otras y complica demasiado la regex. Así que olvídate de ORIGEN: y la necesidad de buscar en el código que acaba de limpiar DIMENSIONES como por los ejemplos. Lo mismo se puede utilizar para ORIGEN una vez que lo hagamos bien.
Básicamente sólo tenemos que deshacernos de la clave (DIMENSIONS:) cuando no tiene texto después de ella y antes del separador |. Cualquier texto antes o después debe ser conservado según los ejemplos.
Creo que el problema está en el uso de "outText = re.sub(fieldName, regexText, replaceText)" porque el valor en replaceText debe ser la cadena de captura de la regex no la cadena en replaceText.