Регулярное выражение для извлечения числа до / после слова - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть 10000 описания, и я хочу использовать регулярные выражения для извлечения числа, связанного с фразой `` арестованный ''.

Например:

"police arrests 4 people"
"7 people were arrested". 

Числадиапазон от 1-99.

Я попробовал следующий код:

gen arrest= regexm(description, "(^[1-9][0-9]$)[ ]*(arrests|arrested)")

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

Ответы [ 3 ]

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

Вы можете использовать это регулярное выражение:

(?:([1-9]?[0-9])[a-zA-Z ]{0,20}(?:arrests|arrested))|(?:(?:arrests|arrested)[a-zA-Z ]{0,20}([1-9]?[0-9]))

Делит поиск на 2 поочередно, независимо от того, находится ли число до или после 'арестов | арестовано'.

Создает незахват Group, который соответствует number от 1 до 9 (что необязательно) и от 0 до 9.За этим следует сопоставление 0 - 20 of any letter и пробела (других слов), прежде чем оно совпадет с 'arrests OR arrested. Затем происходит ИЛИ в противоположной ситуации (где число идет последним).

Это будет совпадать, еслиномер within 20 chars из 'arrests|arrested'.

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

Для меня работает следующее (решение, основанное на идее @ PoulBak):

clear

input strL var1
"This is 1 long string saying that police arrests 4 people"
"3 news outlets today reported that 7 people were arrested"
"several witnesses saw 5 people arrested and other 3 killed"
end

generate var2 = ustrregexs(0) if ustrregexm(var1, "(?:([1-9]?[0-9])[a-zA-Z ]{0,20}(?:arrests|arrested))|(?:(?:arrests|arrested)[a-zA-Z ]{0,20}([1-9]?[0-9]))")

list

   +-------------------------------------------------------------------------------------+
   |                                                       var1                     var2 |
   |-------------------------------------------------------------------------------------|
1. |  This is 1 long string saying that police arrests 4 people                arrests 4 |
2. |  3 news outlets today reported that 7 people were arrested   7 people were arrested |
3. | several witnesses saw 5 people arrested and other 3 killed        5 people arrested |
   +-------------------------------------------------------------------------------------+
0 голосов
/ 14 ноября 2018

Может, как-то так?

(\d+)[^,.\d\n]+?(?=arrest|custody)|(?<=arrest|custody)[^,.\d\n]+?(\d+)

Regex101

Имейте в виду, что это не будет соответствовать текстовым версиям номера (т. Е. Пять человек были арестованы), поэтому вам придется включить это при желании.


Разбивка шаблона

  • (\d+)[^,.\d\n]+?(?=arrest|custody) Первый вариант, если # предшествует просматриваемым терминам
    • (\d+) номер для захвата, с + одна или несколько цифр
    • [^,.\d\n]+? соответствует всему, кроме запятой ,, точки ., цифры \d или новой строки \n. Это предотвращает использование FP разными предложениями (должны содержаться в одном предложении) - +? один или несколько раз (ленивый)
    • (?=arrest|custody) положительный взгляд вперед, проверяя любое слово:
  • (?<=arrest|custody)[^,.\d\n]+?(\d+) Второй вариант, если # идет после просматриваемых терминов
    • (?<=arrest|custody) положительный взгляд за проверкой того, что слово стоит перед #
    • [^,.\d\n]+? соответствует всему, кроме запятой ,, точки ., цифры \d или новой строки \n. Это предотвращает использование FP разными предложениями (должны содержаться в одном предложении) - +? один или несколько раз (ленивый)
    • (\d+) номер для захвата, с + одна или несколько цифр

Разные заметки

Если вы хотите добавить текстовые представления ваших чисел, то включите их в группу захвата (\d+).

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

...