#python #regex
Вопрос:
У меня есть строка, в которой я хочу создать регулярное выражение в python, чтобы найти три повторяющихся слова, первый и последний символ которых должен быть одинаковым, а средний может быть любым символом
Пример строки
s = ‘тимтимдсикму nmunju
итякбонбонджжджд kitkat
гхдндж samsun
ксувйхохоеухдж jimjam
джсю’
Я хочу извлечь все выделенные слова из приведенной выше строки…
Мое решение, но не соответствующее моим требованиям
import re
s='timtimdsikmunmunjuityakbonbonjdjjdkitkatghdnjsamsunksuwjkhokhojeuhjjimjamjsju'
re.findall(r'([a-z].[a-z])(1)',s)
это дает мне это
[('tim', 'tim'), ('mun', 'mun'), ('bon', 'bon'), ('kho', 'kho')]
Я хочу этого
[('kit', 'kat'), ('sam', 'sun'), ('jim', 'jam'),('nmu', 'nju')]
Спасибо
Комментарии:
1. Я думаю, что это не может быть решено только с помощью регулярного выражения. Результат «findall» затем потребует некоторой постобработки (удаления некоторых групповых совпадений из кортежей), чтобы получить желаемый результат.
2. Почему ваш вывод отсутствует
'nmu', 'nju'
?3. @MichaelButscher Спасибо за ответ, Не беспокойтесь о форме вывода, я просто хочу извлечь эти слова, которые можно извлечь в любом формате.
4. @anubhava о, извините, что я добавил это по ошибке, позвольте мне обновить его
5. вы не можете поймать самсуна с помощью регулярного выражения
Ответ №1:
Вы можете использовать группы захвата и ссылки:
s='timtimdsikmunmunjuityakbonbonjdjjdkitkatghdnjsamsunksuwjkhokhojeuhjjimjamjsju'
import re
out = re.findall(r'((.).(.)2.3)', s)
[e[0] for e in out]
выход:
['timtim', 'munmun', 'bonbon', 'kitkat', 'khokho', 'jimjam']
убедитесь, что средняя буква отличается:
[e[0] for e in re.findall(r'((.)(.)(.)2(?!3).4)', s)]
выход:
['nmunju', 'kitkat', 'jimjam']
изменить: разделенный вывод:
>>> [(e[0][:3], e[0][3:]) for e in re.findall(r'((.)(.)(.)2(?!3).4)', s)]
[('nmu', 'nju'), ('kit', 'kat'), ('jim', 'jam')]
Комментарии:
1.Намного ближе, но я просто хочу извлечь одинаковые повторные слова из трех символов, в которых средний символ должен быть другим (точно такие же повторные слова не допускаются, например
timtim
munmun
bonbon
, и т. Д.)2. Спасибо, я дам ему лучшее решение, но я все равно не хочу вводить в код какие-либо уловки и манипуляции. просто прямое регулярное выражение без изменения его результата для получения решения.
3. @Ali , насколько мне известно, использовать только это невозможно
re.findall
, нарезка списка обязательна
Ответ №2:
Всегда есть чистый способ Python:
s = 'timtimdsikmunmunjuityakbonbonjdjjdkitkatghdnjsamsunksuwjkhokhojeuhjjimjamjsju'
result = []
for i in range(len(s) - 5):
word = s[i:(i 6)]
if (word[0] == word[3] and word[2] == word[5] and word[1] != word[4]):
result.append(word)
print(result)
['nmunju', 'kitkat', 'jimjam']
Комментарии:
1. Спасибо за ваш ответ, но мне нужно решение с регулярным выражением
Ответ №3:
Вы можете использовать это регулярное выражение в python:
(?P<first>([a-z])(.)([a-z]))(?P<second>2(?!3).4)
Группа first
предназначена для первого слова и second
предназначена для второго слова.
(?!3)
является отрицательным взглядом, чтобы убедиться, что второй символ не совпадает во 2-м слове.
Демонстрация регулярных выражений
import re
rx = re.compile(r"(?P<first>([a-z])(.)([a-z]))(?P<second>2(?!3).4)")
s = 'timtimdsikmunmunjuityakbonbonjdjjdkitkatghdnjsamsunksuwjkhokhojeuhjjimjamjsju'
for m in rx.finditer(s): print(m.group('first'), m.group('second'))
Выход:
nmu nju
kit kat
jim jam
Ответ №4:
Вы можете сделать это быстрее с помощью for loop:
result2 = []
for i in range(len(s)):
try:
if s[i] == s[i 3] and s[i 2] == s[i 5]:
result2.append((s[i:i 3], s[i 3:i 6]))
except IndexError:pass
print(result2)