Как получить все слова определенной длины, которые не содержат числа? - PullRequest
6 голосов
/ 13 мая 2019

У меня есть вход (включая Unicode):

s = "Question1: a12 is the number of a, b1 is the number of cầu thủ"

Я хочу получить все слова, которые не содержат цифр и имеют более 2 символов, вывод желания:

['is', 'the', 'number', 'of', 'is', 'the', 'number', 'of', 'cầu', 'thủ'].

Я пробовал

re.compile('[\w]{2,}').findall(s)

и получил

'Question1', 'a12', 'is', 'the', 'number', 'of', 'b1', 'is', 'the', 'number', 'of', 'cầu', 'thủ'

Есть ли способ получить только слова без номера?

Ответы [ 2 ]

4 голосов
/ 13 мая 2019

Вы можете использовать

import re
s = "Question1: a12 is the number of a, b1 is the number of cầu thủ"
print(re.compile(r'\b[^\W\d_]{2,}\b').findall(s))
# => ['is', 'the', 'number', 'of', 'is', 'the', 'number', 'of', 'cầu', 'thủ']

Или, если вы хотите ограничиться только ASCII-буквами, состоящими не менее чем из двух букв:

print(re.compile(r'\b[a-zA-Z]{2,}\b').findall(s))

См. Демонстрационную версию Python

Подробности

  • Для сопоставления только букв необходимо использовать [^\W\d_] (или r'[a-zA-Z] вариант только для ASCII)
  • Чтобы соответствовать целым словам, вам нужны границы слов, \b
  • Чтобы убедиться, что вы определяете границы слов, а не символы возврата на одну позицию в шаблоне регулярных выражений, используйте необработанный строковый литерал, r'...'.

Итак, r'\b[^\W\d_]{2,}\b' определяет регулярное выражение, которое соответствует границе слова, двум или более буквам, а затем утверждает, что после этих двух букв нет слова char.

3 голосов
/ 13 мая 2019

Использование str.isalpha:

s = "Question1: a12 is the number of a, b1 is the number of cầu thủ"
[c for c in re.findall('\w{2,}', s) if c.isalpha()]

Выход:

['is', 'the', 'number', 'of', 'is', 'the', 'number', 'of', 'cầu', 'thủ']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...