Как правильно использовать функцию регулярного выражения (регулярное выражение не работает должным образом) - PullRequest
0 голосов
/ 09 июля 2020

Это упражнение, которое я выполняю, и мне даны следующие инструкции:

Придумайте стратегию, которая разделяет знаки препинания или пробелы, за исключением того, что она сохраняет неизменными слова, такие как «Я» или « не было ", которые имеют знак препинания посередине между двумя буквами. (Или когда знак препинания стоит в начале, как в "em", или когда в начале стоит знак доллара.) Примените свою стратегию к trump.words, как определено ниже, чтобы отображались только те слова со знаками препинания и / или знаки доллара. При использовании этой стратегии ответом на упражнение должно быть 102 [не обязательно уникальных, но всего] слова.

Моя попытка ввода кода / строки:

trump.lines = readLines("http://www.stat.cmu.edu/~pfreeman/trump.txt")
my.pattern=("([a-z]|[A-Z]){0,}([[:punct:]]|$){1,}([[:alnum:]]{1,})")
exp=regexpr(my.pattern,trump.lines,useBytes=TRUE)
regmatches(trump.lines,exp)

Результат:

 [1] "would've"          "carefully-crafted" "Administration's" 
 [4] "nation's"          ",000"              "border-crosser"   
 [7] "I've"              "African-American"  "$800"             
[10] "$19"               "$150"              "America's"        
[13] "Let's"             "Clinton's"         "nation's"         
[16] "Clinton's"         "won't"             "\"extremely"      
[19] "America's"         "we're"             "don't"            
[22] "there's"           "African-American"  "it's"             
[25] "America's"         "won't"             "It's"             
[28] "I'm"               "nearly-one"        "China's"          
[31] "it's"              "China's"           "we'll"            
[34] "Middle-income"     "highest-taxed"     "$2"               
[37] "that's"            "We're"             "ten-point"        
[40] "I'm"               "I'll"              "I'm"              
[43] "he'd"              "there's"           "It's"             
[46] "can't"             "don't"             "\"I" 

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

1 Ответ

1 голос
/ 09 июля 2020

Это то, что вам нужно?

grep("['$-]", unlist(strsplit(gsub(" -{1,2}", "", trump.lines), " ")), value = T)

Пояснение: Здесь; мы выполняем четыре операции за одну go:

  1. gsub(" -{1,2}", "", trump.lines) удаляет отдельно стоящие двойные или одинарные дефисы
  2. strsplit(gsub(" -{1,2}", "", trump.lines), " ") разделяет ввод, полученный от предыдущей операции, на 'words' на основе наличия пробелов
  3. unlist(strsplit(gsub(" -{1,2}", "", trump.lines), " ")) выводит результат двух предыдущих операций
  4. grep("['$-]", unlist(strsplit(gsub(" -{1,2}", "", trump.lines), " ")), value = T), наконец, соответствует тем 'словам', которые имеют хотя бы один член из класс символов ' или $ или - в них (поскольку «слова», которым предшествуют " и / или \, имеют один из трех символов в классе символов, эти символы не нужно упоминать явно)

Надеюсь, это поможет.

Вывод:

 [1] "would've"          "would've"          "would've"          "carefully-crafted" "Administration's" 
 [6] "America's"         "That's"            "nation's"          "President's"       "border-crosser"   
[11] "years-old,"        "class'"            "I've"              "Sarah's"           "wasn't"           
[16] "African-American"  "African-American"  "$4,000"            "that's"            "$800"             
[21] "$800"              "We're"             "$19"               "forty-three"       "$150"             
[26] "America's"         "Let's"             "Let's"             "pre-Hillary,"      "Clinton's"        
[31] "America's"         "nation's"          "it's"              "Clinton's"         "laid-off"         
[36] "they're"           "won't"             "can't"             "America's"         "America's"        
[41] "It's"              "It's"              "It's"              "It's"              "nation-"          
[46] "we're"             "don't"             "there's"           "African-American"  "other-"           
[51] "it's"              "America's"         "catch-and-release" "won't"             "It's"             
[56] "I'm"               "nearly-one"        "China's"           "husband's"         "it's"             
[61] "China's"           "we'll"             "don't"             "Middle-income"     "highest-taxed"    
[66] "job-killers"       "$2"                "that's"            "she's"             "that's"           
[71] "she's"             "We're"             "ten-point"         "I'm"               "I'll"             
[76] "they've"           "I'm"               "I'm"               "he'd"              "It's"             
[81] "there's"           "'em"               "It's"              "don't"             "can't"            
[86] "wouldn't"          "doesn't"           "don't"             "Don't"             "don't"            
[91] "It's"              "three-word"        "\"I'm"             "\"I'm"
...