Регулярное выражение для соответствия любому символу, повторяющемуся более 10 раз


107

Я ищу простое регулярное выражение, которое соответствовало бы одному и тому же символу, повторяющемуся более 10 раз. Так, например, если у меня есть документ, усеянный горизонтальными линиями:

=================================================

Он будет соответствовать строке =символов, потому что он повторяется более 10 раз. Обратите внимание, что я бы хотел, чтобы это работало для любого персонажа.


2
заголовок этого ответа вводит в заблуждение, вы должны были сказать «Регулярное выражение для соответствия любому символу, повторяемому более 10 раз»
dalloliogm

Ответы:


159

Вам нужно регулярное выражение /(.)\1{9,}/.

Тест:

#!perl
use warnings;
use strict;
my $regex = qr/(.)\1{9,}/;
print "NO" if "abcdefghijklmno" =~ $regex;
print "YES" if "------------------------" =~ $regex;
print "YES" if "========================" =~ $regex;

Здесь \1это называется обратной ссылкой. Он ссылается на то, что обозначено точкой .между скобками, (.)а затем {9,}запрашивает девять или более одинаковых символов. Таким образом, это соответствует десяти или более любым одиночным символам.

Хотя приведенный выше тестовый сценарий написан на Perl, это очень стандартный синтаксис регулярных выражений, который должен работать на любом языке. В некоторых вариантах вам может понадобиться использовать больше обратной косой черты, например, Emacs заставит вас написать \(.\)\1\{9,\}здесь.

Если вся строка должна состоять из 9 или более одинаковых символов, добавьте якоря вокруг шаблона:

my $regex = qr/^(.)\1{9,}$/;

28

В Python вы можете использовать (.)\1{9,}

  • (.) делает группу из одного символа (любого символа)
  • \ 1 {9,} соответствует девяти или более символам из 1-й группы

пример:

txt = """1. aaaaaaaaaaaaaaa
2. bb
3. cccccccccccccccccccc
4. dd
5. eeeeeeeeeeee"""
rx = re.compile(r'(.)\1{9,}')
lines = txt.split('\n')
for line in lines:
    rxx = rx.search(line)
    if rxx:
        print line

Вывод:

1. aaaaaaaaaaaaaaa
3. cccccccccccccccccccc
5. eeeeeeeeeeee

if re.search (line): print line (назначение переменной rxx не обязательно)
dalloliogm

1
Вы правы в этом простом контексте. Используя переменную rxx, я могу сделать что-то вроде rxx.group (1), rxx.start (1) и т. Д.
Михал Никлас

5

.соответствует любому символу. Используется вместе с уже упомянутыми фигурными скобками:

$: cat > test
========
============================
oo
ooooooooooooooooooooooo


$: grep -E '(.)\1{10}' test
============================
ooooooooooooooooooooooo

Привет, Джик и @SilentGhost. Две команды grep -E '([=o])\1{10}' testи grep -E '([=o]){10}' testотлично работает с вашим примером (обратите внимание на отсутствие \1во второй команде). Но команда grep -E '([=o])\1{10}' <<< '==o==o==o==o==o==o===o==o==='не соответствует строке! Однако команда без \1спичек строки: grep -E '([=o]){10}' <<< '==o==o==o==o==o==o===o==o==='. Не могли бы вы объяснить? Cheers;)
olibre

3

В некоторых приложениях вам нужно удалить косые черты, чтобы они работали.

/(.)\1{9,}/

или это:

(.)\1{9,}

1

используйте оператор {10,}:

$: cat > testre
============================
==
==============

$: grep -E '={10,}' testre
============================
==============

1

Вы также можете использовать PowerShell для быстрой замены слов или повторений символов. PowerShell предназначен для Windows. Текущая версия - 3.0.

$oldfile = "$env:windir\WindowsUpdate.log"

$newfile = "$env:temp\newfile.txt"
$text = (Get-Content -Path $oldfile -ReadCount 0) -join "`n"

$text -replace '/(.)\1{9,}/', ' ' | Set-Content -Path $newfile

1

preg_replaceПример PHP :

$str = "motttherbb fffaaattther";
$str = preg_replace("/([a-z])\\1/", "", $str);
echo $str;

Здесь [a-z]встречается символ, а ()затем он позволяет использовать его с \\1обратной ссылкой, которая пытается сопоставить другой такой же символ (обратите внимание, что это уже нацелено на 2 последовательных символа), таким образом:

мать отец

Если вы сделали:

$str = preg_replace("/([a-z])\\1{2}/", "", $str);

это будет стирать 3 последовательных повторяющихся символа, выводя:

Moherbb ее


0
={10,}

совпадений =, повторяющихся 10 или более раз.


1
уверены, что для этого не нужно 10 и более произвольных символов?
Etan

perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'

это было неправильно, но оно было отредактировано (чтобы соответствовать моему ответу, который получил несколько отрицательных голосов, хорошо)
dalloliogm

2
Ну и дела, не знал, что я должен был прямо сказать, что вы можете заменить персонажа чем угодно.
SilentGhost 02

0

Чуть более общий пример PowerShell. В PowerShell 7 совпадение выделяется, включая последний пробел (вы можете выделить в стеке?).

'a b c d e f ' | select-string '([a-f] ){6,}'

a b c d e f 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.