Поиск последовательных согласных в слове
Мне нужен код, который покажет мне последовательные согласные в слове. Например, для "concertation"
мне нужно получить ["c","nc","rt","t","n"]
.
Вот мой код:
def SuiteConsonnes(mot):
consonnes=[]
for x in mot:
if x in "bcdfghjklmnprstvyz":
consonnes += x + ''
return consonnes
Мне удается найти согласные, но я не вижу, как их найти последовательно. Может ли кто-нибудь сказать мне, что мне нужно делать?
Ответы
Ответ 1
Вы можете использовать регулярные выражения, реализованные в re
module
Лучшее решение
>>> re.findall(r'[bcdfghjklmnpqrstvwxyz]+', "concertation", re.IGNORECASE)
['c', 'nc', 'rt', 't', 'n']
-
[bcdfghjklmnprstvyz]+
соответствует любой последовательности одного или нескольких символов из класса символов
-
re.IGNORECASE
позволяет случайному совпадению символов. Это
>>> re.findall(r'[bcdfghjklmnpqrstvwxyz]+', "concertation", re.IGNORECASE)
['c', 'nc', 'rt', 't', 'n']
Другое решение
>>> import re
>>> re.findall(r'[^aeiou]+', "concertation",)
['c', 'nc', 'rt', 't', 'n']
-
[^aeiou]
Отрицательный класс символов. Соответствует любому символу, отличному от символа в этом классе символов. Это вкратце Соответствует согласным в строке
-
+
quantifer +
соответствует одному или нескольким признакам шаблона в строке
Примечание Здесь также найдутся неалфавитные смежные символы в решении. Поскольку класс символов - это нечто иное, чем гласные
Пример
>>> re.findall(r'[^aeiou]+', "123concertation",)
['123c', 'nc', 'rt', 't', 'n']
Если вы уверены, что вход всегда содержит алфавиты, это решение нормально
re.findall(pattern, string, flags=0)
Return all non-overlapping matches of pattern in string, as a list of strings.
The string is scanned left-to-right, and matches are returned in the order found.
Если вам интересно, как получается результат для
re.findall(r'[bcdfghjklmnpqrstvwxyz]+', "concertation")
concertation
|
c
concertation
|
# o is not present in the character class. Matching ends here. Adds match, 'c' to ouput list
concertation
|
n
concertation
|
c
concertation
|
# Match ends again. Adds match 'nc' to list
# And so on
Ответ 2
Вы можете сделать это с помощью регулярных выражений и функции re
module split
:
>>> import re
>>> re.split(r"[aeiou]+", "concertation", flags=re.I)
['c', 'nc', 'rt', 't', 'n']
Этот метод разбивает строку всякий раз, когда согласовывается один или несколько последовательных гласных.
Чтобы объяснить регулярное выражение "[aeiou]+"
: здесь гласные собраны в класс [aeiou]
, а +
указывает, что одно или несколько вхождений любого символа в этом классе могут быть сопоставлены. Следовательно, строка "concertation"
разбивается на o
, e
, a
и io
.
Флаг re.I
означает, что случай букв будет проигнорирован, что делает класс символов равным [aAeEiIoOuU]
.
Изменить. Следует иметь в виду, что этот метод подразумевает, что это слово содержит только гласные и согласные. Числа и пунктуация будут рассматриваться как негласные/согласные. Чтобы сопоставить только последовательные согласные, вместо этого используйте re.findall
с согласными, перечисленными в классе символов (как указано в других ответах).
Одним полезным ярлыком для ввода всех согласных является использование стороннего regex
вместо re
.
Этот модуль поддерживает операции набора, поэтому класс символов, содержащий согласные, может быть аккуратно записан как весь алфавит за вычетом гласных:
[[a-z]--[aeiou]] # equal to [bcdefghjklmnpqrstvwxyz]
Где [a-z]
- весь алфавит, --
задано различие, а [aeiou]
- гласные.
Ответ 3
Если вы решили использовать не регулярное выражение, itertools.groupby
будет работать отлично, как этот
>>> from itertools import groupby
>>> is_vowel = lambda char: char in "aAeEiIoOuU"
>>> def suiteConsonnes(in_str):
... return ["".join(g) for v, g in groupby(in_str, key=is_vowel) if not v]
...
>>> suiteConsonnes("concertation")
['c', 'nc', 'rt', 't', 'n']
Ответ 4
Действительно, действительно простое решение, не импортируя ничего, это заменить гласные на одну вещь, а затем разделить на эту вещь:
def SuiteConsonnes(mot):
consonnes = ''.join([l if l not in "aeiou" else "0" for l in mot])
return [c for c in consonnes.split("0") if c is not '']
Чтобы он был действительно похож на ваш код - и чтобы добавить генераторы, мы получаем следующее:
def SuiteConsonnes(mot):
consonnes=[]
for x in mot:
if x in "bcdfghjklmnprstvyz":
consonnes.append(x)
elif consonnes:
yield ''.join(consonnes)
consonnes = []
if consonnes: yield ''.join(consonnes)
Ответ 5
def SuiteConsonnes(mot):
consonnes=[]
consecutive = '' # initialize consecutive string of consonants
for x in mot:
if x in "aeiou": # checks if x is not a consonant
if consecutive: # checks if consecutive string is not empty
consonnes.append(consecutive) # append consecutive string to consonnes
consecutive = '' # reinitialize consecutive for another consecutive string of consonants
else:
consecutive += x # add x to consecutive string if x is a consonant or not a vowel
if consecutive: # checks if consecutive string is not empty
consonnes.append(consecutive) # append last consecutive string of consonants
return consonnes
SuiteConsonnes('concertation')
#['c', 'nc', 'rt', 't', 'n']
Ответ 6
Не то, чтобы я рекомендовал его для удобства чтения, но однострочное решение:
In [250]: q = "concertation"
In [251]: [s for s in ''.join([l if l not in 'aeiou' else ' ' for l in q]).split()]
Out[251]: ['c', 'nc', 'rt', 't', 'n']
То есть: присоединяйте неглавные слова с пробелами и снова разделите их на пробелы.
Ответ 7
Используйте регулярные выражения из re
встроенного модуля:
import re
def find_consonants(string):
# find all non-vovels occuring 1 or more times:
return re.findall(r'[^aeiou]+', string)
Ответ 8
Хотя я думаю, что вы должны пойти с ответом @nu11p01n73R, это также сработает:
re.sub('[AaEeIiOoUu]+',' ','concertation').split()