Подтвердить что ты не робот

Поиск последовательных согласных в слове

Мне нужен код, который покажет мне последовательные согласные в слове. Например, для "concertation" мне нужно получить ["c","nc","rt","t","n"].

Вот мой код:

def SuiteConsonnes(mot):
    consonnes=[]
    for x in mot:
        if x in "bcdfghjklmnprstvyz":
           consonnes += x + ''
    return consonnes

Мне удается найти согласные, но я не вижу, как их найти последовательно. Может ли кто-нибудь сказать мне, что мне нужно делать?

4b9b3361

Ответ 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()