Регулярное выражение для извлечения первого слова + первый символ всех следующих слов - PullRequest
1 голос
/ 14 февраля 2020

Я (newb ie) использую R и регулярное выражение для записи регулярного выражения для манипулирования строками в столбце data.frame. Мои данные выглядят так: R:

c1                       
Peter Parker            
Hawk & Dove             
J Jonah Jameson         
3JPX spo                
Bruce Wayne              

Я пытаюсь получить 2-й столбец "c2", который состоит из следующих строк:

c2
PeterP
Hawk&D
JJJ
3JPXs
BruceW

В основном я хочу получить все первое слово строки (независимо от длины) и первый элемент alphanumeri c каждого слова после. Я не смог найти какую-либо функцию или лог c для этого. Можно ли это сделать с помощью регулярных выражений?

Заранее спасибо

Ответы [ 3 ]

6 голосов
/ 14 февраля 2020

Вот базовый подход R с использованием gsub:

x <- c("Peter Parker", "Hawk & Dove", "J Jonah Jameson", "3JPX spo", "Bruce Wayne")
output <- gsub("\\s+(\\S)\\S*(?!\\S)", "\\1", x, perl=TRUE)
output

[1] "PeterP" "Hawk&D" "JJJ"    "3JPXs"  "BruceW"

Шаблон регулярного выражения \s+(\S)\S*(?!\S) соответствует одному или нескольким пробельным символам, затем сопоставляет и захватывает первый символ компонента имени. Он также потребляет оставшуюся часть компонента name, заменяя только захваченный первый символ.

В случае, если вышеизложенное все еще неясно для вас, вот как работает шаблон регулярного выражения, шаг за шагом:

\s+    match one or more space characters
(\S)   then match AND capture the first character of the name-word
\S*    match the remainder of the name-word
(?!\S) assert that what follows the end of the name-word is either a space
       or the end of the string

Замена в вызове gsub - это просто \1, который является первой и единственной группой захвата, соответствующей первой букве каждого имени, за исключением самого первого имени.

0 голосов
/ 20 февраля 2020

Разрабатываемая версия unglue содержит аргумент multiple, который может быть функцией, применяемой к совпадениям с одинаковыми именами (здесь мы хотели бы объединить их с paste0()). В нашем случае мы хотим сопоставить полное первое слово, затем первый символ всех последовательностей, разделенных пробелом, и у нас есть 1 или 2 таких последовательности после первого слова:

# remotes::install_github("moodymudskipper/unglue")
library(unglue)
patterns <- c(
  "{c2} {c2=\\S}{=\\S*} {c2=\\S}{=\\S*}",
  "{c2} {c2=\\S}{=\\S*}")

unglue_data(df$c1, patterns, multiple = paste0)
#>       c2
#> 1 PeterP
#> 2 Hawk&D
#> 3    JJJ
#> 4  3JPXs
#> 5 BruceW  
0 голосов
/ 14 февраля 2020

Хотя это не совсем решение для регулярных выражений, но другой подход может заключаться в получении данных в длинном формате путем разделения каждого слова, получения первого слова в том виде, как оно есть, и взятия только первого символа из оставшихся слов и вставки их.

library(dplyr)

df %>%
  group_by(row = row_number()) %>%
  tidyr::separate_rows(c1, sep = "\\s+") %>%
  summarise(c2 = paste0(first(c1) , paste0(substr(c1[-1], 1, 1), collapse = "")),
            c1 = paste(c1, collapse = " ")) %>%
  select(c1, c2, -row)

#   c1              c2    
#  <chr>           <chr> 
#1 Peter Parker    PeterP
#2 Hawk & Dove     Hawk&D
#3 J Jonah Jameson JJJ   
#4 3JPX spo        3JPXs 
#5 Bruce Wayne     BruceW

данные

df <- structure(list(c1 = c("Peter Parker", "Hawk & Dove", "J Jonah Jameson", 
"3JPX spo", "Bruce Wayne")), row.names = c(NA, -5L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...