ES6: только одна строка в Vanila JS (она возвращает null, если не находит, а не дает ошибку):
'path.string'.split('.').reduce((p,c)=>p&&p[c]||null, MyOBJ)
или пример:
'a.b.c'.split('.').reduce((p,c)=>p&&p[c]||null, {a:{b:{c:1}}})
Для готовая к использованию функция, которая также распознает false, 0 и отрицательное число и принимает значения по умолчанию в качестве параметра:
const resolvePath = (object, path, defaultValue) => path
.split('.')
.reduce((o, p) => o ? o[p] : defaultValue, object)
Пример для использования:
resolvePath(window,'document.body') => <body>
resolvePath(window,'document.body.xyz') => undefined
resolvePath(window,'document.body.xyz', null) => null
resolvePath(window,'document.body.xyz', 1) => 1
Бонус :
Чтобы установить путь (запрошенным @ rob-gordon), вы можете использовать:
const setPath = (object, path, value) => path
.split('.')
.reduce((o,p) => o[p] = path.split('.').pop() === p ? value : o[p] || {}, object)
Пример:
let myVar = {}
setPath(myVar, 'a.b.c', 42) => 42
console.log(myVar) => {a: {b: {c: 42}}}
Доступ к массиву доступа с [] :
const resolvePath = (object, path, defaultValue) => path
.split(/[\.\[\]\'\"]/)
.filter(p => p)
.reduce((o, p) => o ? o[p] : defaultValue, object)
пример
const myVar = {a:{b:[{c:1}]}}
resolvePath(myVar,'a.b[0].c') => 1
resolvePath(myVar,'a["b"][\'0\'].c') => 1
Используйте функцию re.escape()
для этого:
escape (string)
Возвращаемая строка со всеми неалфавитными спицами; это полезно, если вы хотите сопоставить произвольную литеральную строку, которая может иметь в ней метасимволы регулярного выражения.
blockquote>Простейший пример, поиск любого присутствия предоставленной строки, необязательно сопровождаемого 's', и вернуть объект соответствия.
def simplistic_plural(word, text): word_or_plural = re.escape(word) + 's?' return re.match(word_or_plural, text)
Вы можете использовать re.escape () :
re.escape (string) Возвращаемая строка со всеми неалфавитами обратной косой черты; это полезно, если вы хотите сопоставить произвольную литеральную строку, которая может содержать метасимволы регулярного выражения.
blockquote>>>> import re >>> re.escape('^a.*$') '\\^a\\.\\*\\$'
Попробуйте:
\ Q и \ E в качестве якорей
Поместите условие Or в соответствие с полным словом или регулярным выражением.
Ref Ссылка: Как совместить целое слово, которое включает специальные символы в регулярном выражении
К сожалению, re.escape()
не подходит для заменяющей строки:
>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'
Решение состоит в том, чтобы поместить замену в лямбда:
>>> re.sub('a', lambda _: '_', 'aa')
'__'
, потому что возвращаемое значение лямбда обрабатывается re.sub()
как литеральная строка.
repl
для re.sub
является строкой, а не регулярным выражением; применение re.escape
к нему не имеет никакого смысла в первую очередь.
– tripleee
29 January 2018 в 07:54
repl
не является простой строкой, он анализируется. Например, re.sub(r'(.)', r'\1', 'X')
вернет X
, а не \1
.
– Flimm
20 April 2018 в 13:45
repl
: stackoverflow.com/q/49943270/247696
– Flimm
20 April 2018 в 13:54