str_extract_all в stringr не фиксирует все пунктуации [duplicate]

Вот некоторые подходы к работе с асинхронными запросами:
  1. Объект обезьяны браузера
  2. Q - A
  3. A + Promises.js
  4. jQuery отложен
  5. API XMLHttpRequest
  6. Использование концепции обратного вызова - как реализация в первом ответе

Пример: jQuery отложенная реализация для работы с несколькими запросами

var App = App || {};

App = {
    getDataFromServer: function(){

      var self = this,
                 deferred = $.Deferred(),
                 requests = [];

      requests.push($.getJSON('request/ajax/url/1'));
      requests.push($.getJSON('request/ajax/url/2'));

      $.when.apply(jQuery, requests).done(function(xhrResponse) {
        return deferred.resolve(xhrResponse.result);
      });
      return deferred;
    },

    init: function(){

        this.getDataFromServer().done(_.bind(function(resp1, resp2) {

           // Do the operations which you wanted to do when you
           // get a response from Ajax, for example, log response.
        }, this));
    }
};
App.init();
13
задан bartektartanus 5 January 2015 в 11:44
поделиться

2 ответа

В POSIX-подобных механизмах регулярных выражений punct обозначает класс символов, соответствующий функции классификации ispunct() (проверьте man 3 ispunct в UNIX-подобных системах). В соответствии с ISO / IEC 9899: 1990 (ISO C90) функция ispunct() проверяет любой символ печати, кроме пробела или символа, для которого isalnum() истинно. Однако в настройке POSIX детали того, какие символы принадлежат классу, зависят от текущей локали. Таким образом, класс punct здесь не приведет к переносу кода, см. Руководство пользователя ICU в C / POSIX Migration .

С другой стороны, библиотека ICU , на котором stringi полагается и полностью соответствует стандарту Unicode, определяет некоторые из charclasses в своей собственной, но четко определенной и всегда переносимой.

В частности, согласно Unicode Стандарт PLUS SIGN (U+002B) относится к категории Symbol, Math (Sm) (и не является Puctuation Mark (P)).

library("stringi")
ascii <- stri_enc_fromutf32(1:127)
stri_extract_all_regex(ascii, "[[:punct:]]")[[1]]
##  [1] "!"  "\"" "#"  "%"  "&"  "'"  "("  ")"  "*"  ","  "-"  "."  "/"  ":"  ";"  "?"  "@"  "["  "\\" "]"  "_"  "{"  "}" 
stri_extract_all_regex(ascii, "[[:symbol:]]")[[1]]
## [1] "$" "+" "<" "=" ">" "^" "`" "|" "~"

Итак, здесь вы скорее всего, должны использовать такие наборы символов, как [[:punct:][:symbol:]], [[:punct:]+] или даже лучше [\\p{P}\\p{S}] или [\\p{P}+].

Подробнее о доступных классах символов см. ?"stringi-search-charclass" . В частности, ваш интерес представляет Руководство пользователя ICU по UnicodeSet и Unicode Standard Приложение № 44: База данных символов Юникода . НТН

14
ответ дан gagolews 1 September 2018 в 02:05
поделиться

Символьные классы POSIX должны быть обернуты внутри класса символов, правильная форма будет [[:punct:]]. Не путайте термин «класс символов» POSIX с тем, что обычно называется классом символов regex.

Этот класс имен POSIX в диапазоне ASCII соответствует всем неконтролируемым , не-буквенно-числовые , символы без пробела .

ascii <- rawToChar(as.raw(0:127), multiple=T)
paste(ascii[grepl('[[:punct:]]', ascii)], collapse="")
# [1] "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"

Хотя, если действует locale, это может изменить поведение [[:punct:]] ...

R Документация ?regex указывает следующее: Определенные имена классы символов предопределены. Их интерпретация зависит от локали (см. локали ); интерпретация - это языковой стандарт POSIX.

Определение Open Group LC_TYPE для punct говорит:

Определить символы, которые будут классифицироваться как знаки пунктуации .

В локали POSIX не включаются ни <space>, ни любые символы в классах альфа, цифра или cntrl.

В файле определения локали не указывается ни один символ, указанный для ключевых слов: верхний, нижний, альфа, цифра, cntrl, xdigit или как <space>.

< / blockquote>

Однако пакет stringi, похоже, зависит от ICU , а локаль - фундаментальное понятие в ICU.

Используя пакет stringi, я рекомендую использовать Unicode Properties \p{P} и \p{S} .

  • \p{P} соответствует любому знаку пунктуации. То есть отсутствует девять символов, которые включает класс POSIX punct . Это объясняется тем, что Unicode разделяет то, что POSIX считает препинанием на две категории, знаки препинания и символы. Вот где \p{S} встает на место ...
    stri_replace_all_regex(string1, '[\\p{P}\\p{S}]', ' ')
    # [1] "this is a test"            "this  is also a test"     
    # [3] "this is the final  test"   "this is the final   test "
    
  • Или отступите к gsub из базы R, которая справляется с этим очень хорошо.
    gsub('[[:punct:]]', ' ', string1)
    # [1] "this is a test"            "this  is also a test"     
    # [3] "this is the final  test"   "this is the final   test "
    
17
ответ дан hwnd 1 September 2018 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: