Регулярное выражение для повторного шаблона? - PullRequest
0 голосов
/ 30 апреля 2020

Я исчерпал и Stackoverflow, и Google для этого!

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

import re

s = '''
Heey yeah all the waay from heere 
'''
def re_show(pat, s): 
    print(re.compile(pat, re.M).sub("{\g<0>}", s.rstrip()))


print(re_show(r"(\w)(\w)\2(\w*)", s))

Токовый выход {Heey} yeah {all} the {waay} from {heere}

Ожидаемый вывод H{ee}y yeah a{ll} the w{aa}y from h{ee}re.

Я думаю, что мой re_show проверяет буквы перед повторяющимися буквами, но когда я пытаюсь

print(re_show(r"(\w)\2", s))

, я получаю ошибку.

Как вы, наверное, догадались, Regex - не моя самая сильная топика c, на самом деле противоположность.

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

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

def re_show(pat, s):
    print(re.compile(pat, re.M).sub(r"{\g<1>}", s.strip()))

re_show(r"((\w)(\2))", s)
0 голосов
/ 30 апреля 2020

В шаблоне вы используете (\w)(\w)\2(\w*), который будет соответствовать по крайней мере 3 символам с использованием 3 групп захвата, а \g<0> будет содержать все совпадающие.

В замене вы используете {\g<0>}, который является весь матч, окруженный фигурными скобками, которые могут дать вам {heere}, например.


Вы можете использовать одну группу захвата, за которой следует обратная ссылка (\w)\1 и пропустить re.M, так как якорей нет в шаблоне. Вы также можете использовать один оператор печати. ​​

Python demo

Пример кода

import re

s = '''
Heey yeah all the waay from heere 
'''
def re_show(pat, s): 
    print(re.compile(pat).sub("{\g<0>}", s.rstrip()))

re_show(r"(\w)\1", s)

Ouput

H{ee}y yeah a{ll} the w{aa}y from h{ee}re
0 голосов
/ 30 апреля 2020

Вы можете использовать регулярное выражение

r"{(.*?)(?=(.)\2)(\2+)(.*?)}"

, заменяя совпадения на

r"\1{\3}\4"

import re

str = "{Heey} yeah {all} the {wxaay} from {heere} or {eeere} or {xyaaa} or {aaa}"
print re.sub(r"{(.*?)(?!=(.)\1)(.)(\3+)(.*?)}",
  r"\1{\3}\4", str)
  #=> "H{ee}y yeah a{ll} the wx{aa}y from h{ee}re or {eee}re or xy{aaa} or {aaa}"

Regex demo

Python demo

Python regex engine выполняет следующие операции.

{          # match '{'
(.*?)      # match 0+ chars in cap grp 1
(?=(.)\2)  # match is followed by two equal chars
           # (.) being cap grp 2
(\2+)      # match cap grp 2 1+ times, save to cap grp 3
(.*?)      # match 0+ chars, save to cap grp 4
}          # match '}'

(?=(.)\2) is позитивный взгляд .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...