2017-09-12 35 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