Разделить строку запятыми, кроме случаев, когда они заключены в скобки - PullRequest
1 голос
/ 09 января 2020

Я хочу разделить строку запятыми, за исключением случаев, когда в скобках, но моя проблема в том, что вместо скобок

вот пример:

b='hi, this(me,(you)) , hello(a,b)'
re.split(r',(?![^\(]*[\)])', b)
['hi', ' this(me', '(you)) ', ' hello(a,b)']

то, что я ожидаю:

['hi', ' this(me,(you))',' hello(a,b)']

Я видел подобные вопросы с тем, что я хочу, но это не работает так, как я ожидаю. Я не знаю, почему

1- Разделить строку запятыми, кроме случаев, когда в скобках

2- Python - Разделить запятыми, пропустив содержимое в скобках

любая помощь?

Ответы [ 3 ]

1 голос
/ 09 января 2020

Если все основные текстовые группы разделены запятой с пробелом, вы можете использовать re.split:

import re
b='hi, this(me,(you)) , hello(a,b)'
result = re.split(',\s', b)

Вывод:

['hi', 'this(me,(you)) ', 'hello(a,b)']

Однако вы можете также используйте рекурсию для разбора строки:

def parse(d):
  if (v:=next(d, None)) is not None and v != ')':
     yield v if v != '(' else f'({"".join(parse(d))})'
     yield from parse(d)

r, c, l = list(filter(lambda x:x != ',', parse(iter(re.findall('\w+|\(|\)|,', b))))), '', []
for i in r:
   if not i.endswith(')'):
      l.append(c)
      c = i
   else:
      l.append(c+i)
      c = ''

l.append(c)
final_result = list(filter(None, l))

Вывод:

['hi', 'this(me,(you))', 'hello(a,b)']
1 голос
/ 09 января 2020

Попробуйте использовать шаблон (?!\S\)|\()

Пример:

import re

b = ['hi, this(me,(you)) , hello(a,b)', 'hi, this(me,(you))']
for i in b:
    print(re.split(r',(?!\S\)|\()', i))

Выход:

['hi', ' this(me,(you)) ', ' hello(a,b)']
['hi', ' this(me,(you))']
0 голосов
/ 09 января 2020

Подход без регулярных выражений может выглядеть примерно так:

b='hi, this(me,(you))'

phrase = ''
phrases = []

in_parenth = 0

for l in b:

    if l == '(':
        in_parenth += 1
    elif l == ')':
        in_parenth -= 1

    if l == ',' and in_parenth == 0:
        if phrase.strip():
            phrases.append(phrase)
        phrase = ''
    else:
        phrase += l

if phrase.strip():
    phrases.append(phrase)

print(phrases)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...