RegEx, чтобы соответствовать число - PullRequest
0 голосов
/ 20 марта 2020

Я хочу написать функцию grep, чтобы найти, какие строки текста имеют номер ЛЮБОГО формата.

[exs форматов: (156), ( 1,67), (1 467), (1 654,00 долл. США), (одна тысяча двести шестьдесят), (двести шесть) римскими цифрами, такими как MCCXXXIV. ]

** Я предполагаю, что если «я» само по себе, то это английское sh слово, а не римское число **

1 Ответ

0 голосов
/ 20 марта 2020

Вот рабочее решение, основанное на этом ответе , которое мне проще всего получить при работе с границами слов.

Я оставлю вам решать, как Если вы хотите, чтобы числовые слова равнялись go ... обратите внимание, что, как написано, я использую границы слов с числовыми словами, чтобы не допустить совпадения слов типа «нет» или «укушенный», которые содержат числовые слова. Недостатком является то, что хотя он будет совпадать с «двадцать один» и «двадцать один», он не будет совпадать с «двадцать один».

Я немного привел примеры, чтобы проиллюстрировать.

detect_arabic_numerals = function(x) grepl("[0-9]", x)
detect_roman_numerals = function(x) {
  x = gsub("\\bI\\b", "", x, ignore.case = TRUE) # Prevent lone I matches
  grepl("\\b(M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))\\b", x, ignore.case = TRUE)
}

detect_number_words = function(x) {
  number_words = c(
    "one",
    "two", 
    "three",
    "four",
    "five", 
    "six",
    "seven",
    "eight",
    "nine",
    "ten", 
    "eleven",
    "twelve",
    "thirteen",
    "fourteen",
    "fifteen", 
    "sixteen",
    "seventeen",
    "eighteen",
    "nineteen", 
    "twenty",
    "thirty", 
    "forty",
    "fifty",
    "sixty", 
    "seventy",
    "eighty",
    "ninety",
    "hundred",
    "thousand",
    "million"
  )
  grepl(paste("\\b", number_words, "\\b", collapse = "|", sep = ""), x, ignore.case = TRUE)
}
detect_numbers = function(x) {
  detect_arabic_numerals(x) | detect_number_words(x) | detect_roman_numerals(x)
}

stuff<-c("Examples of numbers are one and  two, 3, 1,284 and fifty nine.",
         "Do you have any lucky numbers?",
         "Roman numerals such as XIII and viii are my favorites.", 
         "I also like colors such as blue, green and yellow.",
         "This ice pop costs $1.48.",
         "Extra case none match",
         "But please match this one",
         "Even hyphenated forty-five",
         "Wish to match fortyfive")
stuff[detect_numbers(stuff)]
# [1] "Examples of numbers are one and  two, 3, 1,284 and fifty nine."
# [2] "Roman numerals such as XIII and viii are my favorites."        
# [3] "This ice pop costs $1.48."                                     
# [4] "But please match this one"                                     
# [5] "Even hyphenated forty-five"

Это не идеально - проблема, которую я только что заметил, состоит в том, что, потому что пунктуация считается границей слова, сокращения, где суффикс является действительной римской цифрой, такой как «Я» или «Мы бы "будет соответствовать римским цифрам. Вы можете потенциально удалить пунктуацию как шаг предварительной обработки внутри detect_roman_numerals, так же, как я уже выполняю предварительную обработку для удаления единственного «я».

...