我想写一个python函数,从一个带扩展名的句子(字符串)中获得单词列表。扩展名是重复(3个或更多)英文字母以强调。例如,“bessssst”一词包含一个扩展名。我的功能会采用诸如“鲍勃是最好的”之类的句子。并返回['besssst']
如何找到扩展名并将其替换为python?
起初,我尝试在python中使用正则表达式(re.match('[a-zA-Z][a-zA-Z][a-zA-Z]+')
),但我想要这个词本身,而不仅仅是扩展名。
我想写一个python函数,从一个带扩展名的句子(字符串)中获得单词列表。扩展名是重复(3个或更多)英文字母以强调。例如,“bessssst”一词包含一个扩展名。我的功能会采用诸如“鲍勃是最好的”之类的句子。并返回['besssst']
如何找到扩展名并将其替换为python?
起初,我尝试在python中使用正则表达式(re.match('[a-zA-Z][a-zA-Z][a-zA-Z]+')
),但我想要这个词本身,而不仅仅是扩展名。
不是最优化的,只有尝试了一对夫妇的字符串。
>>>
>>> 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')
>>>
在看到@Matteo Italia的模式后,我认为在\ b的任一端而不是\ s和\ W更好。我知道有一个字的边界序列,但不知何故,当我看着文档时错过了它。 – wwii
我会用:
re.findall(r'(\b\w*(?P<letter>\w)(?P=letter){2}\w*\b)', yourstring)
正则表达式比原始字符串更易读,而不是手动转义。 – abarnert
@abarnert:只要你愿意:) –
你可以做..
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)
我知道Python或它的正则表达式实现零,然而试试这个
\w+([a-zA-Z])\1{2}\w*
我知道你期待的正则表达式,但这个犯规的正则表达式,并使用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.']
这个正则表达式会只要有至少匹配任何字三封信。 – SethMMorton