Регулярное выражение для сопоставления первого и последнего символа слова

#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)