Как я могу удалить текст в круглых скобках с regex?

Вы можете либо фильтровать по SlideOrder модели напрямую

slide = Slide.objects.get(pk=1)
slide_orders = SlideOrder.objects.filter(slide=slide)
for slide_order in slide_orders:
    print slide_order.number

, либо следовать за внешним ключом назад:

slide = Slide.objects.get(pk=1)
slide_orders = slide.slideorder_set.all()
for slide_order in slide_orders:
    print slide_order.number

См. документы в дополнительных полях по отношениям «многие ко многим» для получения дополнительной информации.

61
задан brian d foy 12 March 2009 в 19:18
поделиться

6 ответов

s/\([^)]*\)//

Так в Python, Вы сделали бы:

re.sub(r'\([^)]*\)', '', filename)
104
ответ дан compie 7 November 2019 в 13:30
поделиться

Если Вы не должны абсолютно использовать regex, <забастовка>, использование рассматривает использование Perl текст:: Сбалансированный для удаления круглой скобки.

use Text::Balanced qw(extract_bracketed);

my ($extracted, $remainder, $prefix) = extract_bracketed( $filename, '()', '[^(]*' );

{   no warnings 'uninitialized';

    $filename = (defined $prefix or defined $remainder)
                ? $prefix . $remainder
                : $extracted;
}

можно ли думать, "Почему делают все это, когда regex добивается цели в одной строке?"

$filename =~ s/\([^}]*\)//;

текст:: Сбалансированные дескрипторы вложили круглую скобку. Так $filename = 'foo_(bar(baz)buz)).foo' будет извлечен правильно. regex базировался, решения, предлагаемые здесь, перестанут работать на этой строке. Тот остановится при первом закрытии paren, и другой съест их всех.

$filename = ~ s / ([^}] *)//; # возвращается 'foo_buz)) .foo'

$filename = ~ s / (.*)//; # возвращается 'foo_. нечто'

# текст сбалансировало нечто 'возвратов в качестве примера _). нечто'

, Если любое из regex поведений приемлемо, используйте regex - но зарегистрируйте ограничения и сделанные предположения.

6
ответ дан daotoad 7 November 2019 в 13:30
поделиться

Если бы можно выдержать использовать sed (возможно выполняются из программы, это было бы столь же просто как:

sed 's/(.*)//g'
2
ответ дан Cleb 7 November 2019 в 13:30
поделиться
>>> import re
>>> filename = "Example_file_(extra_descriptor).ext"
>>> p = re.compile(r'\([^)]*\)')
>>> re.sub(p, '', filename)
'Example_file_.ext'
0
ответ дан riza 7 November 2019 в 13:30
поделиться

Если путь может содержать круглые скобки затем r'\(.*?\)' regex недостаточно:

import os, re

def remove_parenthesized_chunks(path, safeext=True, safedir=True):
    dirpath, basename = os.path.split(path) if safedir else ('', path)
    name, ext = os.path.splitext(basename) if safeext else (basename, '')
    name = re.sub(r'\(.*?\)', '', name)
    return os.path.join(dirpath, name+ext)

По умолчанию функция сохраняет заключенные в скобки блоки в каталоге и частях расширения пути.

Пример:

>>> f = remove_parenthesized_chunks
>>> f("Example_file_(extra_descriptor).ext")
'Example_file_.ext'
>>> path = r"c:\dir_(important)\example(extra).ext(untouchable)"
>>> f(path)
'c:\\dir_(important)\\example.ext(untouchable)'
>>> f(path, safeext=False)
'c:\\dir_(important)\\example.ext'
>>> f(path, safedir=False)
'c:\\dir_\\example.ext(untouchable)'
>>> f(path, False, False)
'c:\\dir_\\example.ext'
>>> f(r"c:\(extra)\example(extra).ext", safedir=False)
'c:\\\\example.ext'
3
ответ дан jfs 24 November 2019 в 17:02
поделиться

Я использовал бы:

\([^)]*\)
21
ответ дан Gumbo 24 November 2019 в 17:02
поделиться