匹配所有长度完全相同的单词,并用逗号分隔

时间:2019-01-14 03:27:07

标签: python regex python-3.x

我有一个采用这种格式的字符串:

text = "Louis,Edward,John,Billy,Don,Dean"

我想从该字符串中提取长度在2到4之间的所有名称。如果列表中只有一个名称,则不使用逗号:

text = "Louis"

我正在尝试使用此正则表达式:

import re
pattern = re.compile('(\w{2,4})(,\w{2,4})*')
search_result = pattern.findall('Louis,Edward,John,Billy,Don,Dean')
print(search_result)

结果是:

[('Loui', ''), ('Edwa', ''), ('rd', ',Bill'), ('Don', ',Dean')]

我希望是:

['John', 'Don','Dean']

我在做什么错了?

3 个答案:

答案 0 :(得分:4)

修复正则表达式后,可以在\w{2,4}周围添加单词边界。

re.findall(r'\b\w{2,4}\b', text)
# ['John', 'Don', 'Dean']

或者,

p = re.compile(r'\b\w{2,4}\b')
p.findall(text)
# ['John', 'Don', 'Dean']

这将确保只有长度不超过2-4的名称才匹配。

答案 1 :(得分:0)

RegEx似乎不需要此任务。您可以尝试用逗号分割字符串,然后使用列表理解功能对其进行过滤:

names = 'Louis,Edward,John,Billy,Don,Dean'

result = [name for name in names.split(',') if 2 <= len(name) <= 4]

['John', 'Don', 'Dean']

答案 2 :(得分:0)

您也可以这样做:

text = "Louis,Edward,John,Billy,Don,Dean"
result = list(filter(lambda x:2<=len(x)<=4,text.split(",")))

You can try it here