#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
. В вашем первом комментарии я не понял, какой тип чисел вы хотите сопоставить, можете ли вы привести мне несколько примеров?