Извлечение именованных групп регулярных выражений в LibreOffice Calc

в Python 3 довольно легко извлечь текст из именованных групп, как показано в следующем примере:

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

тем не менее, в LibreOffice Calc я просто не мог понять (Calc даже не имеет независимой функции regex (), которая дает шаблон regex). Позиционные обходные пути, как в этот пост не то, что мне нужно.

пожалуйста, дайте ответы, независимые от позиционных параметров и, пожалуйста, проиллюстрируйте явно. например, mid () не принимается. Хотя приведенный здесь пример достаточно прост, но мне нужен общий способ справиться с реальной ситуацией, которая намного сложнее.

1
задан cbhuang
05.02.2023 9:23 Количество просмотров материала 3652
Распечатать страницу

2 ответа

в Excel и Calc, самым чистым решением является создание макроса регулярного выражения общего назначения. Чтобы сделать это в Calc, перейдите к Tools -> Macros -> Organize Macros -> LibreOffice Basic и добавьте следующий код в 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

теперь вы можете использовать ReFind для любых регулярных выражений, необходимых в электронной таблице. Например, в ячейке A1 введите 12345. В ячейку B1 введите формулу =REFIND($A,"(\d\d)(\d)",2). Это приведет к получению третьего числа, которое равно 3.

код был адаптирован из https://forum.openoffice.org/en/forum/viewtopic.php?t=30502.

Примечание: было бы лучше, чтобы создать регулярное выражение в python или java с помощью добавить-в. Однако для этого требуются файлы XML-декларации в расширении, на настройку которого требуется больше времени.

6
отвечен Jim K 2023-02-06 17:11

AFAIK вы не можете использовать именованные группы в поиске/замене Lo Calc или формулах, но вы можете использовать числовые ссылки к шаблону группы:

  • на поиск поле, вы можете использовать для ссылки на первую группу шаблонов, для второго и так далее.
  • на заменить выражения, использовать в качестве ссылки для первой группы шаблонов поиска, для второго и так на.

образец поиска

принимая четыре строки blue bluefish,black blackfish,blue blackfish и black bluefish, вы можете заменить каждую строку, где один и тот же цвет появляется дважды (строки 1 и 2) с помощью шаблона поиска: (blue|black) fish. The будет ссылаться на соответствующую группу, соответствующую всей строке, только если цвет соответствует в группе регулярных выражений (blue|black) появляется перед fish тоже. (пример на основе вики ООО Документация).

Заменить Пример

преобразовать строку 100/200/300/400 to 300/100/400/200 (С регулярных выражений в опциях поиска), поиск шаблона (\d+)/(\d+)/(\d+)/(\d+) и заменить на ///.

1
отвечен tohuwawohu 2023-02-06 19:28

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх