2013-10-12 52 views
-1

我想写一个python函数,从一个带扩展名的句子(字符串)中获得单词列表。扩展名是重复(3个或更多)英文字母以强调。例如,“bessssst”一词包含一个扩展名。我的功能会采用诸如“鲍勃是最好的”之类的句子。并返回['besssst']如何找到扩展名并将其替换为python?

起初,我尝试在python中使用正则表达式(re.match('[a-zA-Z][a-zA-Z][a-zA-Z]+')),但我想要这个词本身,而不仅仅是扩展名。

+1

这个正则表达式会只要有至少匹配任何字三封信。 – SethMMorton

回答

2

不是最优化的,只有尝试了一对夫妇的字符串。

>>> 
>>> pattern = "\s(\w*?(?P<ext>\w)(?P=ext){2,}\w*?)\W" 
>>> s1 = "Bob is the bessssst." 
>>> s2 = "Bob is the bessssst ." 
>>> ext_re = re.compile(pattern) 
>>> m = ext_re.search(s1) 
>>> m.groups() 
('bessssst', 's') 
>>> m = ext_re.search(s2) 
>>> m.groups() 
('bessssst', 's') 
>>> 

Python Regex Tool

+0

在看到@Matteo Italia的模式后,我认为在\ b的任一端而不是\ s和\ W更好。我知道有一个字的边界序列,但不知何故,当我看着文档时错过了它。 – wwii

1

我会用:

re.findall(r'(\b\w*(?P<letter>\w)(?P=letter){2}\w*\b)', yourstring) 
+2

正则表达式比原始字符串更易读,而不是手动转义。 – abarnert

+0

@abarnert:只要你愿意:) –

2

你可以做..

import re 

def find_ext(text): 
    return re.search(r'(\w*(.)\2{2}\w*)', text).group(1) 

s = 'Bob is the bessssst' 
find_ext(s) 

如果这混淆你,只是用..

return re.search(r'(\w*(\w)\2{2}\w*)', text).group(1) 
1

我知道Python或它的正则表达式实现零,然而试试这个

\w+([a-zA-Z])\1{2}\w* 
2

我知道你期待的正则表达式,但这个犯规的正则表达式,并使用itertools.groupby

strs = "Bob is the bessssst." 
from itertools import groupby 
print [str for str in strs.split() for k, g in groupby(str) if len(list(g)) > 2] 

输出

['bessssst.'] 
相关问题