Удалить нечисловые символы в параграфах - PullRequest
2 голосов
/ 17 октября 2019

Я хочу удалить нечисловые символы в определенных скобках и удалить другие скобки в этой строке. Ниже приведен пример:

text <- c("1110383 Project something 11/22/2019 (WSO) (89021-design)
John Doe (John.Doe@company22.com)",
          "1110383 Project something 11/22/2019 ASP (890212-wso)
John Doe (John.Doe@company22.com)
Other Stuff",
          "1110383 Project something SD (890212)
John Doe (John.Doe@company22.com)")

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

cat(paste0(myoutxt, collapse = "\n"))
# 1110383 Project something 11/22/2019 WSO (89021)
# John Doe (John.Doe@company22.com)
# 1110383 Project something 11/22/2019 ASP (890212)
# John Doe (John.Doe@company22.com)
# 1110383 Project something SD (890212)
# John Doe (John.Doe@company22.com)

Я нашел регулярное выражение, соответствующее моему 5 или 6-значному номеру, но я не уверенкакая должна быть замена. Также я думаю, что следующее должно быть изменено, так как оно не учитывает возможное присутствие других скобок для их удаления.

^.*?\\([^\\d]*(\\d{5,6})[^\\d]*\\).*$

Логика:

По сути, яищем строку с 5-6-значным числом (например, 89021 или 890212) между скобками. Затем, если в скобках есть другие элементы, я хочу их удалить (например, -design или -wso). И, наконец, если в этой конкретной строке есть другие скобки (например, (WSO)), я хочу удалить скобки, а не слово.

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Как насчет замены

(?:\(([^)\d]+)\)(.*?))?\([^\d)]*(\d{5,6})[^\d)]*\)

на

$1$2($3)
  • (?:\(([^)\d]+)\)(.*?))? первый необязательный часть захватывает любой предшествующийскобки в $1. Все, что может последовать до того, как заключенная в скобки часть из 5-6 цифр будет записана в $2
  • \([^\d)]*(\d{5,6})[^\d)]*\), во второй части будет записано 5-6 цифр в $3

См. Демонстрацию на regex101


In с использованием gsub:

gsub(pattern='(?:\\(([^)\\d]+)\\)(.*?))?\\([^\\d)(]*(\\d{5,6})[^\\d)(]*\\)', 
         replacement='\\1\\2(\\3)', 
         x=text, 
         perl=TRUE, fixed = FALSE)
0 голосов
/ 17 октября 2019

Вот боковой подход

fun_0 <- function(string) {
  vec <- strsplit(string, '\\(|\\)', perl = TRUE)[[1L]]
  s <- ifelse(startsWith(string, '('), 1L, 2L)
  e <- length(vec)
  if (s > e)
    return(vec)
  inside_brackets <- seq(s, e, 2L)
  vec[inside_brackets] <- gsub('\\D*(\\d{4,5})\\D*', '(\\1)', vec[inside_brackets])  
  paste(vec, collapse = '')  
}
fun_1 <- function(string_vec) {
  to_process <- grepl('\\d{4,}', string_vec)
  string_vec[to_process] <- vapply(string_vec[to_process], fun_0, character(1))
  paste(string_vec, collapse = '\n')
}
fun_2 <- function(text) {
    string_list <- strsplit(text, '\n')
    vapply(string_list, fun_1, character(1))
}

Примеры

text <- c("1110383 Project something 11/22/2019 (WSO) (89021-design)\nJohn Doe (John.Doe@company22.com)",
          "1110383 Project something 11/22/2019 ASP (890212-wso)\nJohn Doe (John.Doe@company22.com)\nOther Stuff",
          "1110383 Project something SD (890212)\nJohn Doe (John.Doe@company22.com)")
fun_2(text)
# [1] "1110383 Project something 11/22/2019 WSO (89021)\nJohn Doe (John.Doe@company22.com)"                  
# [2] "1110383 Project something 11/22/2019 ASP (89021)2-wso\nJohn Doe (John.Doe@company22.com)\nOther Stuff"
# [3] "1110383 Project something SD (89021)2\nJohn Doe (John.Doe@company22.com)" 
0 голосов
/ 17 октября 2019

Это то, что вы хотите?

  1. "\\(([^0-9@]*)\\)": удалить скобки из всего, что не содержит числа, или @
  2. "\\((\\d{5,6}).*\\)": для скобок, содержащихОт 5 до 6 цифр + что-нибудь еще, оставьте только цифры.

Я предполагал, что другой набор скобок всегда будет содержать адреса электронной почты.

library(stringr)

cat(
  paste0(
    str_replace(
      str_replace(text, "\\(([^0-9@]*)\\)", "\\1"), 
      "\\((\\d{5,6}).*\\)", 
      "\\1"), 
    collapse = "\n"
  )
)

# 1110383 Project something 11/22/2019 WSO (89021)
# John Doe (John.Doe@company22.com)
# 1110383 Project something 11/22/2019 ASP (890212)
# John Doe (John.Doe@company22.com)
# Other Stuff
# 1110383 Project something SD (890212)
# John Doe (John.Doe@company22.com)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...