从提取的正则表达式值中删除括号

时间:2015-04-07 08:19:06

标签: python regex

这是我的正则表达式的输入和结果:

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 个答案:

答案 0 :(得分: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']

注意逻辑很简单,您只需要匹配左括号(和后面括一个开括号)(的紧密括号之间的字符串。< / p>

答案 1 :(得分:1)

您需要匹配()(之间或)()之间的字符串。这样就可以避免在'(rect)'中匹配'(di(rect)or.n)'之类的字符串。您可以使用lookaround assertions来执行此操作,因为他们不会使用搜索到的字符串。

Lookahead断言

  

(?=...)       匹配如果...匹配下一个,但不消耗任何字符串。   这称为先行断言。例如,Isaac (?=Asimov)只有在'Isaac '之后才匹配'Asimov'

积极的外观断言

  

(?<=...)       匹配,如果字符串中的当前位置前面是匹配...,结束于当前位置。这被称为a   积极的看法断言。 (?<=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))

答案 2 :(得分: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']