Текст с / n соответствия в регулярных выражениях и Openrefine - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь отфильтровать текст с new lines в открытом уточнении.

Ввод:

Them Spanish girls love me like I'm Aventura
I'm the man, y'all don't get it, do ya?
Type of money, everybody acting like they knew ya
Go Uptown, New York City, bitch
Them Spanish girls love me like I'm Aventura
Tell Uncle Luke I'm out in Miami, too
Them Spanish girls love me like I'm Aventura

Ожидаемый результат будет:

Type of money, everybody acting like they knew ya
Go Uptown, New York City, bitch
Them Spanish girls love me like I'm Aventura

Я пытаюсь получить строку с ключевым словом и строки до и после.

Мой код для этого со стандартным регулярным выражением выглядит так:

/((.*\n){2})^.*\b(New York)\b.*((.*\n){3})/m

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

value.match(/.*(\New York)/.*)

У кого-нибудь есть идеи, как я мог это сделать?Мне действительно нужно соблюдать правила, поэтому я не могу сделать replace(/\n/,'') перед матчем.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Если вы чувствуете, что полностью избегаете RegEx и просто читаете текст и пишете строку до, а строку после этого - то, что вы можете получить, если вы напишите текст в ячейке A1 в Excel:

Public Sub TestMe()

    Dim inputString As String
    inputString = Range("A1")

    Dim lookForWord As String
    lookForWord = "New York"

    Dim inputArr As Variant
    inputArr = Split(inputString, vbLf)

    Dim line As Variant
    Dim previousLine As String
    Dim foundWord As Boolean
    Dim linesAfter As Long: linesAfter = 1

    For Each line In inputArr
        If InStr(1, line, lookForWord) Then
            previousLine = previousLine & vbCrLf & line
            foundWord = True
        Else
            If foundWord And linesAfter Then
                previousLine = previousLine & vbCrLf & line
                linesAfter = linesAfter - 1
            ElseIf linesAfter Then
                previousLine = line
            End If
        End If
    Next line

    If Not linesAfter Then Debug.Print previousLine

End Sub

Split() анализирует текст в массив следующим образом:

enter image description here

переменная linesAfter может сказать, сколько строк послеслово должно быть отображено.

0 голосов
/ 08 июня 2018

Совершенно новый OpenRefine 3 имеет find() функцию , намного более удобную для пользователя, чем match().

Я думаю, что это регулярное выражение должно помочь:

value.find(/(.*\n){1}.+New York.+(\n.*){1}/).join('\n')

Результат:

enter image description here

Если по какой-то причине вы предпочитаете оставаться в OpenRefine 2.8, Python / Jython предлагает альтернативу:

import re
matches = re.findall(r".+?\n.+New York.+\n.+", value)
return "\n".join(matches)

Результат:

enter image description here

...