2017-09-12 36 views
1

我查询的序列:与正则表达式序列词语

NUNCA [ADV + NEG + CIRC]MÁS[ADV +补偿+ CIRC]compraré[V + H_PREDICAT_ACTION]

NUNCA更多酒店compraré

我的脚本:

corpus = "Me[Unknown] temo[Unknown] que[Unknown] buscare[Unknown] 
otras[Unknown] opciones[Unknown] esta[Unknown] nunca[ADV+NEG+CIRC] 
más[ADV+comp+PADV+H_CIRCONSTANT_QUANTITE] compraré[V+H_PREDICAT_ACTION]" 

part1 = re.findall(r"(\w+)\[ADV\+NEG.*?\]", corpus) 
part2 = re.findall(r"(\w+)\[ADV+comp+PADV.*?\]", corpus) 
part3 = re.findall(r"(\w+)\[V\+H_PREDICAT.*?\]", corpus) 
print(part1 + part2 + part3) 

结果:

[]

回答

1

如果搜索的子​​串为以任意的顺序 - 使用以下:re.findall()方法:

corpus = "Me[Unknown] temo[Unknown] que[Unknown] buscare[Unknown] \ 
otras[Unknown] opciones[Unknown] esta[Unknown] nunca[ADV+NEG+CIRC] \ 
más[ADV+comp+PADV+H_CIRCONSTANT_QUANTITE] compraré[V+H_PREDICAT_ACTION]" 

result = ' '.join(i[0] for i in re.findall(r'(\w+)\[[^][]*(AD|V)\+[^][]*\]', corpus, re.M | re.UNICODE)) 
print(result) 

输出:

nunca más compraré 

正则表达式模式解释:

  • (\w+) - 匹配字(字母数字序列)(对于离。 nunca)。放置到第一捕获组(...)

  • \[ - 匹配打开方括号[字面上

  • [^][]* - 匹配除了方括号的一个或多个字符][

  • (AD|V) - 交替组,匹配或者ADV钥匙

  • \] - mat ch关闭方括号]从字面上看

for ex。\[[^][]*(AD|V)\+[^][]*\]将匹配[ADV+NEG+CIRC]

----------

如果序列的顺序是严格 - 使用re.sub()功能,而不是re.findall()删除所有括号序列:

corpus = "Me[Unknown] temo[Unknown] que[Unknown] buscare[Unknown] \ 
otras[Unknown] opciones[Unknown] esta[Unknown] nunca[ADV+NEG+CIRC] \ 
más[ADV+comp+PADV+H_CIRCONSTANT_QUANTITE] compraré[V+H_PREDICAT_ACTION]" 

result = re.sub(r'\[[^][]+\]', '', corpus, re.M | re.UNICODE) 
print(result) 

输出:

Me temo que buscare otras opciones esta nunca más compraré 

要提取的最后3个字:

print(' '.join(result.split()[-3:])) # nunca más compraré 
+1

@pitanga,你也可以检查我的're.findall'方法 – RomanPerekhrest

+0

非常感谢!我可以利用并问你一些其他问题吗?如果序列不在字符串的末尾,我怎么能找到它? – pitanga

+1

@pitanga,那就是我的're.findall'方法 – RomanPerekhrest