манипуляции с питоном - PullRequest
6 голосов
/ 01 мая 2011

У меня есть строка s с вложенными скобками: s = "AX(p>q)&E((-p)Ur)"

Я хочу удалить все символы между всеми парами скобок и сохранить в новой строке, например: new_string = AX&E

Я пытался сделать это:

p = re.compile("\(.*?\)", re.DOTALL)
new_string = p.sub("", s)

Дает вывод: AX&EUr)

Есть ли способ исправить это, вместо итерации каждого элемента в строке?

Ответы [ 7 ]

6 голосов
/ 01 мая 2011

Другим простым вариантом является удаление внутренних скобок на каждом этапе, пока не останется больше скобок:

p = re.compile("\([^()]*\)")
count = 1
while count:
    s, count = p.subn("", s)

Рабочий пример: http://ideone.com/WicDK

5 голосов
/ 01 мая 2011

Вы можете просто использовать строковые манипуляции без регулярного выражения

>>> s = "AX(p>q)&E(qUr)"
>>> [ i.split("(")[0] for i in s.split(")") ]
['AX', '&E', '']

Я оставляю вам возможность присоединиться к струнам.

4 голосов
/ 01 мая 2011
>>> import re
>>> s = "AX(p>q)&E(qUr)"
>>> re.compile("""\([^\)]*\)""").sub('', s)
'AX&E'
3 голосов
/ 01 мая 2011

Да, это должно быть:

>>> import re
>>> s = "AX(p>q)&E(qUr)"
>>> p = re.compile("\(.*?\)", re.DOTALL)
>>> new_string = p.sub("", s)
>>> new_string
'AX&E'
2 голосов
/ 01 мая 2011

Вы можете использовать PyParsing для анализа строки:

from pyparsing import nestedExpr
import sys

s = "AX(p>q)&E((-p)Ur)"
expr = nestedExpr('(', ')')
result = expr.parseString('(' + s + ')').asList()[0]
s = ''.join(filter(lambda x: isinstance(x, str), result))
print(s)

Большая часть кода взята: Как можно реализовать рекурсивное регулярное выражение в python?

2 голосов
/ 01 мая 2011

Вложенные скобки (или теги, ...) - это то, что невозможно обработать обычным способом с помощью регулярных выражений.Подробнее см. http://www.amazon.de/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124/ref=sr_1_1?ie=UTF8&s=gateway&qid=1304230523&sr=8-1-spell.Вам понадобится настоящий парсер.

Можно построить регулярное выражение, которое может обрабатывать два уровня вложенности, но они уже безобразны, три уровня уже будут довольно длинными.И вы не хотите думать о четырех уровнях.; -)

1 голос
/ 01 мая 2011

Вы можете использовать re.subn():

import re

s = 'AX(p>q)&E((-p)Ur)'
while True:
    s, n = re.subn(r'\([^)(]*\)', '', s)
    if n == 0:
        break
print(s)

выход

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