Как использовать регулярное выражение с kwic, чтобы получить все совпадения?

Кажется, я не могу получить желаемый результат, используя qwic quanteda. Вот что я пробовал:

library(quanteda)
library(tidyverse)

Учитывая этот текст

text <- "This is a phone number: 222-222-2222. Here's another phone number...(111)111 1111. This -- 333-3333 -- aint a complete phone number."

Вот регулярное выражение, которое соответствует большинству телефонных номеров в США вместе с любыми символами с каждой стороны номера.

regex.phone1 <- "\\D\\(?\\d{3}\\)?[.\\s-]?\\s*\\d{3}[.\\s-]?\\s*[.\\s-]*\\d{4}\\D"

Здесь он соответствует первому числу, что означает, что регулярное выражение работает должным образом.

regmatches(text,regexpr(regex.phone1,text))

" 222-222-2222." 

Но kwic ни к чему не подходит. Этот:

 kwic(
  x = text,
  pattern = regex.phone1,
  window = 5,
  valuetype = "regex",
  case_insensitive = TRUE
) %>%
  as_tibble

возвращает:

A tibble: 0 x 7
… with 7 variables: docname <chr>, from <int>, to <int>, pre <chr>, keyword <chr>,
  post <chr>, pattern <fct>

Я хочу, чтобы он совпадал со всеми телефонными номерами, а именно:

222-222-2222.

. (111) 111 1111.

(и поместите их в обычную форму вывода kwic, которая отображает до, после и многое другое).


person dca    schedule 02.09.2020    source источник
comment
Не уверен, как kwic работает, но вы можете использовать шаблон в str_extract_all для извлечения всех слов, которые соответствуют шаблону. stringr::str_extract_all(text, regex.phone1)[[1]]   -  person Ronak Shah    schedule 02.09.2020


Ответы (1)


Я пытался сопоставить телефонные номера, составив phrases из регулярных выражений.

library(quanteda)
library(tidyverse)

text <- "This is a number: 541 145-8884 also 222-222-2222 Here's (444)111-1111. No. 555 666 7774"

kwic(
  x = text,
  phrase(c("^[\\d]{10}$","^[\\d]{3} [\\d]{3}-[\\d]{4}$","^[\\d]{3}-[\\d]{3}-[\\d]{4}$","^[\\d]{3} [\\d]{3} [\\d]{4}$","^[(] [\\d]{3} [)] [\\d]{3}-[\\d]{4}$")),
  window = 3,
  valuetype = "regex",
  separator = " ",
  case_insensitive = FALSE
) %>%
  
print(as_tibble)

# Output:                                                                                                 
#   [text1, 6:7]                a number: |   541 145-8884   | also 222-222-2222 Here's
#   [text1, 9:9]        541 145-8884 also |   222-222-2222   | Here's( 444             
# [text1, 11:14] also 222-222-2222 Here's | ( 444 ) 111-1111 | . No.                   
# [text1, 18:20]                    . No. |   555 666 7774   |                      
person Ankit    schedule 02.09.2020
comment
Кроме того, мое исходное регулярное выражение соответствовало числу, которому предшествовала буква, а ваше - нет. Он должен соответствовать этому # preceded by a character -111-111-1111. and followed by a non-# too - person dca; 02.09.2020
comment
Кроме того, он должен совпадать с этим: 1112223333 (но, возможно, этого не было в моей исходной спецификации!) - person dca; 02.09.2020
comment
Я отредактировал ответ, теперь он соответствует 1112223333. В вашем первом комментарии я не понял, какой тип чисел вы хотите сопоставить, вы можете привести мне несколько примеров? - person Ankit; 03.09.2020