I have a string which has multiple brackets. Let says
s="(a(vdwvndw){}]"
I want to extract all the brackets as a separate string.
I tried this:
>>> brackets=re.search(r"[(){}[]]+",s)
>>> brackets.group()
But it is only giving me last two brackets.
'}]'
Why is that? Shouldn’t it fetch one or more of any of the brackets in the character set?
asked Jun 10, 2015 at 19:59
useruser
711 gold badge1 silver badge5 bronze badges
5
You have to escape the first closing square bracket.
r'[(){}[]]+'
To combine all of them into a string, you can search for anything that doesn’t match and remove it.
brackets = re.sub( r'[^(){}[]]', '', s)
answered Jun 10, 2015 at 20:02
TigerhawkT3TigerhawkT3
48.2k6 gold badges58 silver badges96 bronze badges
Use the following (Closing square bracket must be escaped inside character class):
brackets=re.search(r"[(){}[]]+",s)
↑
answered Jun 10, 2015 at 20:03
karthik manchalakarthik manchala
13.5k1 gold badge31 silver badges55 bronze badges
4
The regular expression "[(){}[]]+"
(or rather "[](){}[]+"
or "[(){}[]]+"
(as others have suggested)) finds a sequence of consecutive characters.
What you need to do is find all of these sequences and join them.
One solution is this:
brackets = ''.join(re.findall(r"[](){}[]+",s))
Note also that I rearranged the order of characters in a class, as ]
has to be at the beginning of a class so that it is not interpreted as the end of class definition.
answered Jun 10, 2015 at 20:08
Michał TrybusMichał Trybus
11.4k3 gold badges30 silver badges41 bronze badges
2
You could also do this without a regex:
s="(a(vdwvndw){}]"
keep = {"(",")","[","]","{","}"}
print("".join([ch for ch in s if ch in keep]))
((){}]
answered Jun 10, 2015 at 20:36
3
Имеется такая строка:
String someString = "{{[cc(c)ggg]}ssss}";
Необходимо отфильтровать её с помощью Regex или средствами Java 8 таким образом, что бы в ней остались лишь символы “{, }, [, ], (, )”. Порядок следования элементов должен остатся прежним.
P.S. if-else не предлагать 🙂
задан 16 окт 2018 в 16:18
2
Чтобы добавить квадратные скобки в символьный класс, необходимо их экранировать. Такая необходимость продиктована тем, что символьные классы в регулярных выражениях Java поддерживают объединение ([a-d[m-p]]
находит буквы от a
до d
, или от m
до p
), пересечение ([a-z&&[def]]
находит только d
, e
или f
) и вычитание ([a-z&&[^bc]]
находит буквы от a
до z
, кроме b
и c
) именно с помощью квадратных скобок.
Используйте
String result = someString.replaceAll("[^(){}\]\[]+", "");
^^^^^^
См. демо на Java и демо регулярного выражения.
Подробности
[^
– начало отрицающего (негативного) символьного класса, который находит любой символ кроме(
– открывающей круглой скобки)
– закрывающей круглой скобки{
– открывающей фигурной скобки}
– закрывающей фигурной скобки]
– закрывающей квадратной скобки[
– открывающей квадратной скобки
]+
– 1 и более раз.
ответ дан 17 окт 2018 в 6:44
Wiktor StribiżewWiktor Stribiżew
21k3 золотых знака23 серебряных знака48 бронзовых знаков
Помогите плз. разобраться
Функция которая показывает правильно ли закрыты раскрыты скобки 3-ий день мучаюсь. Вот мой код:
function check(str, bracketsConfig) {
let resault = [];
let resaultDouble = [];
let itemPos;
const strArr = str.split('');
for(let i=0; i<strArr.length;){
let item = strArr.shift();
for(let k = 0; k<bracketsConfig.length; k++){
itemPos = bracketsConfig[k].indexOf(item);
if(itemPos === -1){
continue;
}
// console.log(`itemPos = ${itemPos}`);
if(k==0){
if(itemPos %2 === 0){
resault.push(itemPos +1)
}
else{
if(resault.pop() !== itemPos) {
continue;
}
}
}else{
if(itemPos %2 === 0){
resaultDouble.push(itemPos +1)
}
else{
if(resaultDouble.pop() !== itemPos) {
continue;
}
}
}
}
}
// console.log(resault);
if(resault > 0 || resaultDouble > 0){
console.log('false');
}
else{
console.log('true');
}
}
check('()', [['(', ')']]) // -> true
check('((()))()', [['(', ')']]) // -> true
check('())(', [['(', ')']]) // -> false
check('([{}])', [['(', ')'], ['[', ']'], ['{', '}']]) // -> true
check('[(])', [['(', ')'], ['[', ']']]) // -> false
check('[]()', [['(', ')'], ['[', ']']]) // -> true
check('[]()(', [['(', ')'], ['[', ']']]) // -> false
Все отрабатывает нормально, кроме вот этой:
check('[(])', [['(', ')'], ['[', ']']]) // -> false
так как функция думает чтот все ок, массивы пришли пустые и мне она выдает true, а надо false
0 / 0 / 0 Регистрация: 18.11.2012 Сообщений: 17 |
|
1 |
|
Поиск скобок в строке с использованием регулярных выражений12.03.2014, 19:22. Показов 16881. Ответов 4
Есть строка, в которой нужно знать есть ли там скобки “{” “}”, но скобки в регулярных выражениях есть спец символ. Спец символ отменяется “”, но со скобками это не работает. Перебор строки посимвольнo не интересует, я знаю как это cделать, нужно именно регулярки.
0 |
mutagen 2586 / 2259 / 257 Регистрация: 14.09.2011 Сообщений: 5,185 Записей в блоге: 18 |
||||
12.03.2014, 19:47 |
2 |
|||
Сообщение было отмечено deathlike как решение Решение
1 |
0 / 0 / 0 Регистрация: 18.11.2012 Сообщений: 17 |
|
12.03.2014, 19:53 [ТС] |
3 |
Спасибо, но можно было просто написать Pattern p = Pattern.compile(“[\{\}]”); и все!
0 |
2586 / 2259 / 257 Регистрация: 14.09.2011 Сообщений: 5,185 Записей в блоге: 18 |
|
12.03.2014, 20:03 |
4 |
можно было просто написать просто было интересно поиграться с разными патернами (кроме вашего), а в конце просто скопировал всё как есть )
0 |
Почетный модератор 16842 / 6720 / 880 Регистрация: 12.06.2012 Сообщений: 19,967 |
|
12.03.2014, 21:18 |
5 |
Внутри символьного класса можно было и не экранировать.
0 |
Разберём типичную задачу бэкенд-разработчика.
На сервер постоянно приходят разные запросы от других компьютеров. Прежде чем сервер ответит на запрос, он должен разобраться, правильно ли этот запрос составлен. В нашем случае запрос — это строка, внутри которой может быть несколько логических блоков, каждый из которых берётся в свои скобки: (), [] или {}.
Сложность в том, что такие блоки могут быть вложены друг в друга, например так: (..[..]){..}(..) или так: {([..]..)..}. При этом мы заранее не знаем количество скобок и уровни вложенности. Наша задача — проверить, правильно ли расставлены скобки. Это значит:
Например, ()(..){} — это правильная последовательность скобок, (..){[]..} — тоже правильная, а ({..)} — неправильная.
Нужно написать код, который берёт строку с запросом, проверяет её и сообщает, в порядке там скобки или нет.
Сразу сформируем строку, которую будем проверять. Писать будем на Python, но это можно сделать на любом другом языке:
# строка для проверки
input = '(Привет!)(Это){[журнал]}([]код)'
Теперь, чтобы было проще работать, избавимся от всех лишних символов в строке. Так как нам нужно сохранить оригинальный запрос, создадим новую переменную, пустую на старте, и заполним её только скобками. Для этого мы посмотрим все символы в исходной строке и возьмём оттуда только скобки:
# строка, с которой в итоге будем работать, на старте пустая
s = ''
# список скобок
brackets = '()[]{}'
# перебираем все символы в исходной строке
for x in input:
# если очередной символ — скобка
if x in brackets:
# добавляем его в новую строку
s += x
А теперь — самая хитрость: в новой строке мы будем искать готовые пары скобок, которые стоят рядом, и убирать их. Логика такая: как бы мы ни вкладывали скобки друг в друга, всё равно в конце у нас будет одна открывающая, а за ней — такая же закрывающая. Так как мы убрали все лишние символы, то такие скобки будут идти сразу друг за другом: (), [] или {}. При этом, когда убираем внутренние скобки, внешние тоже начинают образовывать готовую пару. Сейчас покажем на примере.
В нашем случае строка без лишних символов будет выглядеть так: ()(){[]}([]). Теперь уберём оттуда все готовые пары, шаг за шагом:
- ()(){[]}([]) → (){[]}([])
- (){[]}([]) → {[]}([])
- {[]}([]) → {}([])
- {}([]) → ([])
- ([]) → ()
- () → пустая строка
Получается, что если мы в итоге получим пустую строку, то все скобки были расставлены правильно. А если в новой строке останутся символы — значит, им не нашлось пары и скобки были расставлены неправильно.
Запишем это в коде:
# пока в новой строке есть пары скобок
while '()' in s or '[]'in s or '{}' in s:
# меняем их на пустые символы → убираем пары скобок из строки
s = s.replace('()','').replace('[]','').replace('{}','')
# если после обработки в новой строке остались символы — значит, было что-то непарное
if len(s) !=0:
print('В скобках ошибка')
# в противном случае, если строка пустая — значит, мы всё обработали верно
else:
print('Всё в порядке')
Теперь попробуйте сделать это на JavaScript. Если это покажется слишком лёгкой задачей — сделайте так, чтобы код сообщал номер символа, где первый раз встречается неправильная скобка.
# стока для проверки
input = '(Привет!)(Это){[журнал]}([]код)'
# строка, с которой в итоге будем работать, на старте пустая
s = ''
# список скобок
brackets = '()[]{}'
# перебираем все символы в исходной строке
for x in input:
# если очередной символ — скобка
if x in brackets:
# добавляем его в новую строку
s += x
# пока в новой строке есть пары скобок
while '()' in s or '[]'in s or '{}' in s:
# меняем их на пустые символы → убираем пары скобок из строки
s = s.replace('()','').replace('[]','').replace('{}','')
# если после обработки в новой строке остались символы — значит, было что-то непарное
if len(s) !=0:
print('В скобках ошибка')
# в противном случае, если строка пустая — значит, мы всё обработали верно
else:
print('Всё в порядке')