在 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() 函数来提供正则表达式模式)。基于位置的解决方法如下这个帖子不是我需要的。
请给出与位置参数无关的答案,并请明确举例说明。例如,MID() 是不可接受的。虽然这里给出的例子足够简单,但我需要一种通用的方法来处理远为复杂的实际情况。
答案1
在 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$1,"(\d\d)(\d)",2)
。这将检索第三个数字,即 3。
代码改编自https://forum.openoffice.org/en/forum/viewtopic.php?t=30502。
注意:最好使用 Python 或 Java 创建正则表达式加入。然而,这需要扩展中的 XML 声明文件,这需要更多时间来设置。
答案2
据我所知,你不能在 LO Calc 搜索/替换或公式中使用命名组,但你可以使用数字参考到模式组:
- 在里面搜索字段,您可以用来
\1
引用第一个模式组、\2
第二个模式组等等。 - 在里面代替表达式,
$1
作为第一个搜索模式组的参考,$2
作为第二个搜索模式组的参考,依此类推。
搜索示例
假设有四个字符串blue bluefish
,black blackfish
和blue blackfish
,black bluefish
您可以使用搜索模式替换每个出现两次相同颜色的字符串(字符串 1 和 2):。(blue|black) \1fish
将引用匹配组,仅当正则表达式组中匹配的颜色也出现在之前时才\1
匹配整个字符串。((blue|black)
fish
基于 OOo Wiki 文档的示例)。
替换示例
要将字符串转换100/200/300/400
为300/100/400/200
(在搜索选项中启用正则表达式),请搜索模式(\d+)/(\d+)/(\d+)/(\d+)
并替换为$3/$1/$4/$2
。