3 votos

PyQGIS buscar y reemplazar texto usando regex

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: ?\|? ?)" enter image description here

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.

1voto

Monique Puntos 11

Inténtalo:

((?<=^...)(DIMENSIONS:  \|))|( \| DIMENSIONS: )|( ?\|? ORIGIN:$)|( ?ORIGIN: \| )

Pero es feo..

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X