这是我的正则表达式的输入和结果:
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']
正则表达式的任何变化?
答案 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']