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

#r #regex #quanteda

#r #регулярное выражение #квантовая

Вопрос:

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

 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, которые отображают pre, post и многое другое).

Комментарии:

1. Не уверен, как kwic работает, но вы можете использовать шаблон в str_extract_all , чтобы извлечь все слова, которые удовлетворяют шаблону. stringr::str_extract_all(text, regex.phone1)[[1]]

Ответ №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   |                      
  

Комментарии:

1. Кроме того, мое исходное регулярное выражение соответствовало числу, которому предшествовала не буква, а ваше — нет. Оно должно соответствовать этому # preceded by a character -111-111-1111. and followed by a non-# too

2. Кроме того, оно должно совпадать с этим: 1112223333 (но, возможно, этого не было в моей оригинальной спецификации!)

3. Я отредактировал ответ, теперь он будет соответствовать 1112223333 . В вашем первом комментарии я не понял, какой тип чисел вы хотите сопоставить, можете ли вы привести мне несколько примеров?