Regex заменить все несоответствующие буквы пробелом в R [дубликат]

Таким образом, почти каждый ответ здесь, кажется, пропустит конкретный момент. Переменные класса никогда не становятся переменными экземпляра, как показано в приведенном ниже коде. Используя метакласс, чтобы перехватить присвоение переменной на уровне класса, мы видим, что когда a.myattr переназначается, магия метода назначения полей в классе не вызывается. Это связано с тем, что присваивание создает новую переменную экземпляра. Это поведение абсолютно не имеет ничего общего с переменной класса, как показано вторым классом, который не имеет переменных класса и все же допускает присвоение поля.

class mymeta(type):
    def __init__(cls, name, bases, d):
        pass

    def __setattr__(cls, attr, value):
        print("setting " + attr)
        super(mymeta, cls).__setattr__(attr, value)

class myclass(object):
    __metaclass__ = mymeta
    myattr = []

a = myclass()
a.myattr = []           #NOTHING IS PRINTED
myclass.myattr = [5]    #change is printed here
b = myclass()
print(b.myattr)         #pass through lookup on the base class

class expando(object):
    pass

a = expando()
a.random = 5            #no class variable required
print(a.random)         #but it still works

IN SHORT Переменные класса НИЧЕГО НЕ делают с переменными экземпляра .

Более ясно. Они просто попадают в область поиска по экземплярам. Переменные класса фактически являются переменными экземпляра для самого объекта класса. Вы также можете иметь метаклассивные переменные , если хотите, а также потому, что сами метаклассы тоже являются объектами. Все это объект, независимо от того, используется ли он для создания других объектов или нет, поэтому не следует привязывать семантику использования других слов в классе слов. В python класс - это просто объект, который используется для определения того, как создавать другие объекты и каковы их поведение. Метаклассы - это классы, которые создают классы, чтобы еще раз проиллюстрировать этот момент.

3
задан John Chrysostom 21 July 2015 в 17:48
поделиться

1 ответ

R по умолчанию использует стандарт регулярных выражений POSIX (Portable Operating System Interface) (см. эти сообщения SO [ 1 , 2 ] и ?regex [ caveat emptor : плотность уровня мачете]].

Взгляд вперед ((?=...)), look-behind ((?<=...)) и их отрицания ((?!...) ] и (?<!...)), вероятно, являются наиболее яркими примерами форматов PCRE -специфических (Perl-совместимых регулярных выражений), которые не совместимы с POSIX.

R можно обучить понять ваше регулярное выражение, активировав опцию perl на TRUE; эта опция доступна во всех функциях регулярного выражения base (gsub, grepl, regmatches и т. д.):

output <- sub("\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)",
              "!", "This is a test string?", perl = TRUE)
4
ответ дан Community 25 August 2018 в 17:40
поделиться
Другие вопросы по тегам:

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