Как выделить подстроку на основе регулярного выражения и превратить ее в Excel или HTML - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующий фрейм данных:

dat <-  structure(list(value = c("YMNSMQEML", "FIYRHMFCV", "VLFKFDMFI", 
"KLLDRFPVA", "RVLDDFTKL")), .Names = "value", row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"))

dat
#>       value
#> 1 YMNSMQEML
#> 2 FIYRHMFCV
#> 3 VLFKFDMFI
#> 4 KLLDRFPVA
#> 5 RVLDDFTKL

Учитывая следующий шаблон регулярных выражений L.{2}[FR] Я хотел бы создать Excel, в котором подстрока выделена жирным шрифтом.

enter image description here

Как мне этого добиться?


UPDATE Используя оператор LIKE:

Option Explicit
Sub boldSubString_LIKE_OPERATOR()
    Dim R As Range, C As Range
    Dim MC As Object
    Set R = Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))

    For Each C In R
        C.Font.Bold = False
        If C.Text Like "L**F" Then
            Set MC = .Execute(C.Text)
            C.Characters(MC(0).firstindex + 1, MC(0).Length).Font.Bold = True
        End If
    Next C

End Sub

Он прерывается на Set MC = .Execute(C.Text), дает недопустимую или неквалифицированную ссылку на ошибку компиляции.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Чтобы сделать это в Excel, вы получаете доступ к свойству Characters объекта Range: (и содержимое должно быть фактической строкой; не формула, которая возвращает строку)

Option Explicit
Sub boldSubString()
    Dim R As Range, C As Range
    Dim RE As Object, MC As Object
    Const sPat As String = "L.{2}[FR]"

'Range to be processed
Set R = Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))

'Initialize Regex engine
'Could use early binding if desireable
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = False
    .ignorecase = True
    .Pattern = sPat

    For Each C In R
        C.Font.Bold = False
        If .test(C.Text) Then
            Set MC = .Execute(C.Text)
            C.Characters(MC(0).firstindex + 1, MC(0).Length).Font.Bold = True
        End If
    Next C
End With

End Sub

enter image description here

0 голосов
/ 02 июля 2018

Поскольку вы также упомянули HTML, вы можете сгенерировать Rmarkdown HTML документ и окружить шаблон с помощью тегов <b></b>. Минимальный пример использования функции str_replace из пакета stringr:

---
output:
  html_document: default
title: "Pattern"
---


```{r echo = FALSE}
library(stringr)

## your data
dat <-  structure(list(value = c("YMNSMQEML", "FIYRHMFCV", "VLFKFDMFI",
"KLLDRFPVA", "RVLDDFTKL")), .Names = "value", row.names = c(NA,
-5L), class = c("tbl_df", "tbl", "data.frame"))


pattern <- "(L.{2}[FR])" # in brackets to reuse it in str_replace as \1
## surround \1 group with the bold tag
dat$value <-  str_replace(dat$value, pattern, "<b>\\1</b>")

knitr::kable(dat)
```

click here to see the result

...