Я хочу извлечь все возможные подстроки, содержащие все гласные, из строки. Например, в коде:
import re
text = "thisisabeautifulsequencofwords"
pattern = r"(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)[ \w]*?"
match = re.findall(pattern, text, re.DOTALL)
print(match)
Я хочу получить следующие результаты:
['thisisabeautifulsequenco','thisisabeautifulsequencof','sisabeautifulsequenco'....]
Как это сделать?
Приведенный ниже код может помочь вам решить вашу проблему с использованием 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)
Исправленная идентификация. Можете ли вы поделиться кодом сравнения строк совпадений с результатом? Я этого не понимаю.
Инициализируйте новый список matches_final=[]
, затем вместо return matches
сделайте matches_final.append(matches)
, тогда ваша функция должна вернуть вновь созданный список
Я бы подошел к этой задаче без использования регулярных выражений, а именно
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
Вы хотите расширить окончательный список строк результатов списком совпадений на каждой внешней итерации цикла for. Также отступы отсутствуют..