Совпадение всех слов точной длины, разделенных запятой - PullRequest
0 голосов
/ 14 января 2019

У меня есть строка в этом формате:

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 голосов
/ 14 января 2019

Исправляя свое регулярное выражение, вы можете добавить границы слов вокруг \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, только если они не являются частью большой строки.

0 голосов
/ 14 января 2019

Вы также можете сделать это:

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

Вы можете попробовать здесь

0 голосов
/ 14 января 2019

RegEx кажется ненужным для этой задачи. Вы можете попробовать разбить строку на запятые, а затем отфильтровать ее с использованием списка:

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

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

['John', 'Don', 'Dean']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...