2015-04-07 3 views
3

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

temp2 = '(LEFT-WALL)(who)(is.v)(the)(di(rect)or.n)(of)(Inceptio)(RIGHT-WALL)' 
print regex.findall(r'\([^\)\(]*+(?:(?R)[^\)\(]*)*+\)', temp2) 

результат:

['(LEFT-WALL)', '(who)', '(is.v)', '(the)', '(di(rect)or.n)', '(of)', '(Inceptio)', '(RIGHT-WALL)'] 

Я хочу, чтобы этот вид результата :;

['LEFT-WALL', 'who', 'is.v', 'the', 'di(rect)or.n', 'of', 'Inceptio', 'RIGHT-WALL'] 

любое изменение в регулярном выражении?

ответ

3

В качестве альтернативы без использования регулярных выражений вы можете сделать работу только с str.split() и str.strip() методами:

>>> [i.strip('()') for i in temp2.split(')(')] 
['LEFT-WALL', 'who', 'is.v', 'the', 'di(rect)or.n', 'of', 'Inceptio', 'RIGHT-WALL'] 

Или с регулярным выражением вы можете использовать look-around в своем регулярном выражении:

>>> re.findall(r'(?<=\()(.*?)(?=\)\(|\)$)', temp2) 
['LEFT-WALL', 'who', 'is.v', 'the', 'di(rect)or.n', 'of', 'Inceptio', 'RIGHT-WALL'] 

Примечание что логика проста, вам просто нужно совместить строку, которая находится между открытой скобкой ( и закрывающей скобкой, за которой следует открытая скобка ket )(.

1

Вам необходимо сопоставить либо строки, которые находятся между ( и )(, либо между )( и ). Таким образом, вы избегаете соответствия строк, таких как '(rect)' в '(di(rect)or.n)'. Вы можете сделать это, используя lookaround assertions, так как они не потребляют искомую строку.

Lookahead утверждение:

(?=...) Пропускать ... матчи рядом, но не потребляет строки. Это называется смотровым утверждением. Например, Isaac (?=Asimov) будет соответствовать 'Isaac ', только если за ним следует 'Asimov'.

Позитивное утверждение просмотра назад:

(?<=...) Срабатывает, если текущая позиция в строке предшествует матче за ... который заканчивается в текущем положении. Это называется положительным утверждением lookbehind. (?<=abc)def найдет матч в abcdef, так как lookbehind будет поддерживать 3 символа и проверить, соответствует ли совпадающим шаблонам.

В приведенном ниже коде я использую флаг re.VERBOSE, чтобы сделать его более читаемым.

pattern = re.compile(r""" 

(?<= \() .+? (?= \)\() # Matches string after a '(' and before a ')(' 

|         # or... 

(?<= \)\() .+? (?= \) ) # Matches string after a ')(' and before a ')'  

""", re.VERBOSE) 


print (re.findall(pattern, temp2)) 
1

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

temp2 = '(LEFT-WALL)(who)(is.v)(the)(di(rect)or.n)(of)(Inceptio)(RIGHT-WALL)' 
if temp2[0:1] == "(" and temp2[-1:] == ")": 
    print temp2[1:-1].split(")(") 

Вывод sample program:

['LEFT-WALL', 'who', 'is.v', 'the', 'di(rect)or.n', 'of', 'Inceptio', 'RIGHT-WALL'] 
Смежные вопросы