Как использовать регулярное выражение для извлечения набора определенных подстрок?

Я хочу извлечь все возможные подстроки, содержащие все гласные, из строки. Например, в коде:

import re
text = "thisisabeautifulsequencofwords"
pattern = r"(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)[ \w]*?"
match = re.findall(pattern, text, re.DOTALL)
print(match)

Я хочу получить следующие результаты:

['thisisabeautifulsequenco','thisisabeautifulsequencof','sisabeautifulsequenco'....]

Как это сделать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Приведенный ниже код может помочь вам решить вашу проблему с использованием Regix re в Python.

import re

def get_substrings_with_all_vowels_regex(text):
    pattern = r'(?=(.{5,}))'  # Positive lookahead for substrings of length >=5
    matches = []

    # Iterate over all possible starting positions
    for match in re.finditer(pattern, text):
        start = match.start()
        # Try all possible substrings starting from 'start' position
        for end in range(start + 5, len(text) + 1):
            substring = text[start:end]
            if all(vowel in substring for vowel in 'aeiou'):
                matches.append(substring)
         return matches

text = "thisisabeautifulsequencofwords"
result = get_substrings_with_all_vowels_regex(text)
print(result)

Вы хотите расширить окончательный список строк результатов списком совпадений на каждой внешней итерации цикла for. Также отступы отсутствуют..

marc nicole 25.08.2024 16:25

Исправленная идентификация. Можете ли вы поделиться кодом сравнения строк совпадений с результатом? Я этого не понимаю.

Hamza Mehboob 25.08.2024 16:33

Инициализируйте новый список matches_final=[], затем вместо return matches сделайте matches_final.append(matches), тогда ваша функция должна вернуть вновь созданный список

marc nicole 25.08.2024 18:43

Я бы подошел к этой задаче без использования регулярных выражений, а именно

text = "thisisabeautifulsequencofwords"
vowels = set("aeiou")
substrings = []
for start in range(len(text)+1):
   for end in range(start+1,len(text)+1):
       sub = text[start:end]
       if vowels.issubset(sub):
           substrings.append(sub)
print(*substrings, sep = "\n")

дает результат

thisisabeautifulsequenco
thisisabeautifulsequencof
thisisabeautifulsequencofw
thisisabeautifulsequencofwo
thisisabeautifulsequencofwor
thisisabeautifulsequencofword
thisisabeautifulsequencofwords
hisisabeautifulsequenco
hisisabeautifulsequencof
hisisabeautifulsequencofw
hisisabeautifulsequencofwo
hisisabeautifulsequencofwor
hisisabeautifulsequencofword
hisisabeautifulsequencofwords
isisabeautifulsequenco
isisabeautifulsequencof
isisabeautifulsequencofw
isisabeautifulsequencofwo
isisabeautifulsequencofwor
isisabeautifulsequencofword
isisabeautifulsequencofwords
sisabeautifulsequenco
sisabeautifulsequencof
sisabeautifulsequencofw
sisabeautifulsequencofwo
sisabeautifulsequencofwor
sisabeautifulsequencofword
sisabeautifulsequencofwords
isabeautifulsequenco
isabeautifulsequencof
isabeautifulsequencofw
isabeautifulsequencofwo
isabeautifulsequencofwor
isabeautifulsequencofword
isabeautifulsequencofwords
sabeautifulsequenco
sabeautifulsequencof
sabeautifulsequencofw
sabeautifulsequencofwo
sabeautifulsequencofwor
sabeautifulsequencofword
sabeautifulsequencofwords
abeautifulsequenco
abeautifulsequencof
abeautifulsequencofw
abeautifulsequencofwo
abeautifulsequencofwor
abeautifulsequencofword
abeautifulsequencofwords
beautifulsequenco
beautifulsequencof
beautifulsequencofw
beautifulsequencofwo
beautifulsequencofwor
beautifulsequencofword
beautifulsequencofwords
eautifulsequenco
eautifulsequencof
eautifulsequencofw
eautifulsequencofwo
eautifulsequencofwor
eautifulsequencofword
eautifulsequencofwords
autifulsequenco
autifulsequencof
autifulsequencofw
autifulsequencofwo
autifulsequencofwor
autifulsequencofword
autifulsequencofwords

Объяснение: я использую вложенный цикл for, чтобы получить начало и конец каждой подстроки ненулевой длины, затем я проверяю, являются ли гласные подмножеством символов в указанной подстроке, и если да, то добавляю их в список подстрок.

Хотя это работает, проблема в том, что оно решает проблему в порядке n^2. Я немного изменил код и добавил предложение прерывания для пропуска, когда уже известно, что в подстроке есть не все гласные, чтобы уменьшить количество итераций, но есть ли способ внести дальнейшие изменения, чтобы повысить эффективность использования времени? изменения, которые я внес: for end in range(len(text),start+4,-1): sub = text[start:end] if vowels.issubset(sub): substrings.append(sub) else: break

Ritajit Pal 25.08.2024 17:53

Другие вопросы по теме

Негативный просмотр, похоже, не работает должным образом
Объединить многострочные строки в фрейме данных pandas на основе шаблона регулярного выражения
Регулярное выражение для текста, разделенного запятыми, с необязательными двойными кавычками, которые могут содержать кавычки, экранированные обратной косой чертой
Почему эта замена регулярного выражения с использованием захвата зависает в этом быстром коде?
Токенизация XSLT с помощью регулярного выражения для токенизации только в том случае, если за точкой с запятой не следует пробел и число
Regex соответствует определенным шаблонам URL-адресов
Используйте одно регулярное выражение для извлечения информации из двух шаблонов
Регулярное выражение для соответствия начальной нумерации или алфавитным маркерам, например (a)
Как включить проверку наличия большего количества пробелов в негативном виде?
Анализ регулярных выражений "^[-\wÀ-ÿ\'\.\-\&\s]+$" - диапазон [x-y] в обратном порядке