Estrarre gruppi denominati di espressione regolare in LibreOffice Calc

In Python 3, è abbastanza facile estrarre il text da gruppi nominati come mostrato nell'esempio seguente:

import re myStr = r"4000/2000/5000/7000" reObj = re.compile(r"""(?P<g1>\d+) # a capturing group named g1 / (?P<g2>\d+) / (?P<g3>\d+) / (?P<g4>\d+)""", re.VERBOSE) matchObj = reObj.match(myStr) # match the string to be searched print(matchObj.group("g1")) # 4000 print(matchObj.group("g2")) # 2000 print(matchObj.group("g3")) # 5000 print(matchObj.group("g4")) # 7000 

Tuttavia, in LibreOffice Calc non ho semplicemente potuto get alcun indizio (Calc non ha nemless una function indipendente regex () che fornisce un pattern di regex). Soluzioni alternative basate sulla posizione come in questo post non sono ciò di cui ho bisogno.

PLEASE GARE RISPOSTE INDIPENDENTI DEI PARAMETRI POSIZIONALI e esprimete EXPLICITAMENTE. ad esempio MID () non è accettabile. Anche se l'esempio qui fornito è abbastanza semplice, ma ho bisogno di un modo generale per affrontare una situazione reale molto più complessa.

  • Trovare e sostituire il text tra ^ e ~ in Notepad ++
  • In libreoffice calc, come posso usare l'handle di riempimento per copiare le formule, ma non la formattazione di cella / bordo?
  • Grep tool per XML
  • LibreOffice Calc: Come get il totale per HH: MM: celle SS
  • Come posso elencare each altra estensione di file utilizzando regex su Linux?
  • Sed solo esprimere l'espressione corrispondente
  • Editor con ricerca e sostituzione muti-line
  • Trova parole ripetute in un text
  • Come posso trovare e sostituire il text circondato tra parentesi con regex su Microsoft Word
  • Come trovare la linea con il numero massimo di colonne / caratteri in Vim / gVim?
  • Aggiunta di una costante in LibreOffice Calc
  • LibreOffice Calc che richiede di aggiornare i "collegamenti ad altri file". Perché?
  • 2 Solutions collect form web for “Estrarre gruppi denominati di espressione regolare in LibreOffice Calc”

    In Excel e Calc, la soluzione più pulita è quella di creare una macro di espressione regolare generalizzata. Per effettuare questa operazione in Calc, accedere a Tools -> Macros -> Organize Macros -> LibreOffice Basic e aggiungere il seguente codice a Module1:

     Function ReFind(findIn, patt, Optional group_param As Integer, _ Optional ignoreCase_param As Boolean) ' findIn - string or cell to search in ' patt - regexp string or cell containing regexp string ' group - which group to grab - analogy to \n in regexp syntax ' ignoreCase - false for case sensitive matches If IsMissing (group_param) Then group = 0 Else group = group_param End If If IsMissing (ignoreCase_param) Then ignoreCase = False Else ignoreCase = ignoreCase_param End If oTextSearch = CreateUnoService("com.sun.star.util.TextSearch") oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions") oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP If ignoreCase Then oOptions.transliterateFlags = _ com.sun.star.i18n.TransliterationModules.IGNORE_CASE End If oOptions.searchString = patt oTextSearch.setOptions(oOptions) oFound = oTextSearch.searchForward(findIn, 0, Len(findIn)) If oFound.subRegExpressions = 0 Then ReFind = "No results" MsgBox "No results" Exit Function ElseIf group >= oFound.subRegExpressions Then ReFind = "No result for that group" MsgBox "No result for that group" Exit Function Else nStart = oFound.startOffset() nEnd = oFound.endOffset() ReFind = Mid(findIn, nStart(group) + 1, nEnd(group) - nStart(group)) End If End Function 

    Ora è ansible utilizzare ReFind per tutte le espressioni regolari necessarie nel foglio di calcolo. Ad esempio, nella cella A1 immettere 12345 . Nella cella B1, immettere la formula =REFIND($A$1,"(\d\d)(\d)",2) . Questo recupererà il terzo numero, che è 3.

    Il codice è stato adattato da https://forum.openoffice.org/en/forum/viewtopic.php?t=30502 .

    Nota: Sarebbe meglio creare l'espressione regolare in python o java utilizzando un componente aggiuntivo . Tuttavia, ciò richiede i file di dichiarazione XML in un'estensione, che richiede più tempo per impostare.

    AFAIK non è ansible utilizzare i gruppi nominati in LO Calc Search / Replace o formule, ma è ansible utilizzare riferimenti numbersci ai gruppi di pattern:

    • Nel field di ricerca , è ansible utilizzare \1 per fare riferimento al primo gruppo di pattern, \2 per il secondo e così via.
    • Nell'espressione di sostituzione , utilizzare $1 come riferimento per il primo gruppo di ricerca, $2 per il secondo e così via.

    Esempio di ricerca

    Supponendo che le quattro stringhe blue bluefish , black blackfish , black blackfish blue blackfish e black bluefish , è ansible sostituire each string where lo stesso colore appare due volte (stringhe 1 e 2) utilizzando il pattern di ricerca: (blue|black) \1fish . Il \1 indicherà il gruppo corrispondente, che corrisponde all'intera string solo se il colore corrispondente nel gruppo di regex (blue|black) viene visualizzato anche prima del fish . ( Esempio basato sulla documentazione OOo Wiki ).

    Sostituire l'esempio

    Per trasformare la string 100/200/300/400 a 300/100/400/200 (con regex triggersta nelle opzioni di ricerca), cercare il pattern (\d+)/(\d+)/(\d+)/(\d+) e sostituire con $3/$1/$4/$2 .

    Siamo il genio del computer e della rete.