Как разделить несколько UPPERCASE / разделитель / текст с помощью регулярных выражений?(VBA), - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть 2k + записей с правилом следования строк (LOCATION I UPPERCASE - text) x несколько раз, например:

I- TRZON - Fragmenty błony śluzowej trzonu żołądka w stanie przewleklego 
powierzchownego (++) aktywnego (++) zapalenia. W barwieniu Warthin-Starry 
nie stwierdza się bakterii odpowiadających Helicobacter pylori. II-ANTRUM + 
KĄT - Fragmenty błony śluzowej części odźwiernikowej żołądka w stanie 
przewlekłego głębokiego zapalenia (+++). W barwieniu Warthin-Starry nie 
stwierdza się bakterii odpowiadajacych Helicobacter pylori.

, которые я пытаюсь разбить следующим образом с помощью регулярных выражений:

Location - I- TRZON
Text Fragmenty błony śluzowej trzonu żołądka w stanie przewleklego powierzchownego (++) aktywnego (++) zapalenia. W barwieniu Warthin-Starry nie stwierdza się bakterii odpowiadających Helicobacter pylori.
Location II- ANTRUM + KĄT
Text Fragmenty błony śluzowej części odźwiernikowej żołądka w stanie przewlekłego głębokiego zapalenia (+++). W barwieniu Warthin-Starry nie stwierdza się bakterii odpowiadajacych Helicobacter pylori.

До сих пор мне удавалось сделать это, создав нечто подобное

([A-ZŻŹĆĄŚĘŁÓŃ\s,+\-0-9]*)[\s]?-+?(.*[^A-ZŻŹĆĄŚĘŁÓŃ\s,+\-0-9]) ([A-ZŻŹĆĄŚĘŁÓŃ\s,+\-0-9]+)*[\s]?-+?(.*)

Но, очевидно, он не может управлять теми строками, где возможна одна или три пары местоположения и текста.Основными проблемами, с которыми я столкнулся, являются дефисы, используемые в тексте (см. Warthin-Starry).

Если я попробую что-нибудь более изящное, например

([A-ZŻŹĆŃĄŚŁĘÓ]+[\s-\+,]*?)-(.*)

Это, очевидно, соответствует только слову перед первымдефис в первую группу, а все остальное в следующую.

Подводя итог: как перевести в регулярное выражение что-то вроде: сопоставить, разбить на две группы: 1) верхний регистр текста с любыми другими знаками (без строчных букв),затем 2) текст, то есть до тех пор, пока вы столкнетесь с другим текстом в верхнем регистре.

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

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Спасибо за ваш вклад.Мне, наконец, удалось сделать это с помощью двух подпрограмм:

Sub locfinder()

Dim myregexp As RegExp
Set myregexp = New RegExp
Dim myMatches As Variant
Dim myMatch As Variant
Dim str As String
Dim i, j As Integer
Dim endrow As Integer
Sheets("dane").Activate
endrow = LastRow
Dim rozp1, rozp2 As String

For i = 1 To endrow
str = Sheets("Dane").Cells(i, 10).Value
myregexp.Global = True
myregexp.Pattern = "([A-ZŻŹĆĄŚĘŁÓŃ]+[\s,+\-0-9]*[A-ZŻŹĆĄŚĘŁÓŃ]*[\s,+\-0-9]*[A-ZŻŹĆĄŚĘŁÓŃ]*[\s,+\-0-9]*|Trzon|Antrum)\s?-"

If Not str = "" Then
Set myMatches = myregexp.Execute(str)
 j = 1
 For Each myMatch In myMatches
    If myMatch.Value <> "" Then
    Sheets("Dane").Cells(i, j + 10).Value = Trim(myMatch.SubMatches(0))
    j = j + 1
    End If
Next
End If
Next i
End Sub

Затем извлекли диагнозы, используя

Sub rozpfinder()
Dim myregexp As RegExp
Set myregexp = New RegExp

Dim myMatches As Variant
Dim myMatch As Variant
Dim str As String
Dim i, j As Integer
Dim endrow As Integer
Sheets("dane").Activate
endrow = LastRow
Dim rozp, loc As Collection
Dim splitted() As String
Dim rozpoznanie, lokalizacja
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Dane")

For i = 1 To endrow
    str = ws.Cells(i, 10).Value
    Set loc = New Collection
    Set rozp = New Collection

    For j = 1 To 2
        If ws.Cells(i, 10 + j) <> "" Then
            loc.Add ws.Cells(i, 10 + j).Value
        End If
    Next j
    For Each lokalizacja In loc
        If lokalizacja <> "I" Then
        str = Replace(str, lokalizacja, "xxx")
        Else
        lokalizacja = "I-"
        str = Replace(str, lokalizacja, "xxx-")
        End If
    Next lokalizacja
    splitted = split(str, "xxx")
    For j = 0 To UBound(splitted)
        If splitted(j) <> "" Then
        myregexp.Pattern = "-[^\w]"
        myMatch = myregexp.Replace(splitted(j), "")
        rozp.Add (Trim(myMatch))
        End If
    Next j
    j = 1
    For Each rozpoznanie In rozp
        ws.Cells(i, 12 + j).Value = rozpoznanie
        j = j + 1
    Next rozpoznanie
Next i
End Sub

Хотя это не было на 100% точно, число записей, которые мне нужно исправить, равнооколо 1%, так что я думаю, что это работает:)

0 голосов
/ 24 ноября 2018

Я не уверен, как вы можете сделать это с помощью RegEx, мне самому трудно разобраться с этим синтаксисом.

Однако я, вероятно, просто использовал бы DATA / Text To Columns,разделить с помощью дефиса и просто объединить дополнительные разбиения, вызванные дефисами в тексте.

Если это не просто однократная обработка, вы также всегда можете использовать VBA, например:

Sub TextToColumns()
    Dim ws As Worksheet: Set ws = ActiveSheet
    Dim lRow As Long, sndHyphen As Long, R As Long

    lRow = ws.Cells(1, 1).End(xlDown).Row

    For R = 1 To lRow                                                               'Iterate through all rows containing this data
        sndHyphen = InStr(InStr(ws.Cells(R, 1), "-") + 1, ws.Cells(R, 1), "-")      'Get the hyphens positions
        ws.Cells(R, 2) = Left(ws.Cells(R, 1), sndHyphen - 2)                        'Get the data before the second hyphen
        ws.Cells(R, 3) = Mid(ws.Cells(R, 1), sndHyphen + 2)                         'Get the data after the second hyphen
    Next R

End Sub
...