Как найти в строке скобку

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

user's user avatar

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

TigerhawkT3's user avatar

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 manchala's user avatar

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ł Trybus's user avatar

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

Padraic Cunningham's user avatar

3

Имеется такая строка:

String someString = "{{[cc(c)ggg]}ssss}";

Необходимо отфильтровать её с помощью Regex или средствами Java 8 таким образом, что бы в ней остались лишь символы “{, }, [, ], (, )”. Порядок следования элементов должен остатся прежним.

P.S. if-else не предлагать 🙂

Wiktor Stribiżew's user avatar

задан 16 окт 2018 в 16:18

Антон Цуркану's user avatar

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żew's user avatar

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 как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * 
 * @author mutagen
 */
public class BracesFind {
    public static void main(String[] args) {
        String[] s = { "with { braces left", "with braces } right", "with both {}", "without braces" };
        Pattern p = Pattern.compile("[\{\}]");
        Matcher m = null;
        for (String str : s) {
            m = p.matcher(str);
            System.out.println(str + " " + (m.find() ? "found" : "not found"));
        }
    }
}



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

Цитата
Сообщение от deathlike
Посмотреть сообщение

можно было просто написать

просто было интересно поиграться с разными патернами (кроме вашего), а в конце просто скопировал всё как есть )



0



Почетный модератор

Эксперт HTML/CSSЭксперт PHP

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

А теперь — самая хитрость: в новой строке мы будем искать готовые пары скобок, которые стоят рядом, и убирать их. Логика такая: как бы мы ни вкладывали скобки друг в друга, всё равно в конце у нас будет одна открывающая, а за ней — такая же закрывающая. Так как мы убрали все лишние символы, то такие скобки будут идти сразу друг за другом: (), [] или {}. При этом, когда убираем внутренние скобки, внешние тоже начинают образовывать готовую пару. Сейчас покажем на примере.

В нашем случае строка без лишних символов будет выглядеть так: ()(){[]}([]). Теперь уберём оттуда все готовые пары, шаг за шагом:

  1. ()(){[]}([]) → (){[]}([])
  2. (){[]}([]) → {[]}([])
  3. {[]}([]) → {}([]) 
  4. {}([]) → ([]) 
  5. ([]) → ()
  6. () → пустая строка

Получается, что если мы в итоге получим пустую строку, то все скобки были расставлены правильно. А если в новой строке останутся символы — значит, им не нашлось пары и скобки были расставлены неправильно.

Запишем это в коде:

# пока в новой строке есть пары скобок
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('Всё в порядке') 

Добавить комментарий