2009-11-02 2 views
58

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

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

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

+1

название этого asnwer вводит в заблуждение, вы должны были сказать «Regular выражение для соответствия любому символу, повторенному более чем в 10 раз ' – dalloliogm

ответ

102

Регулярное выражение вам нужно, это /(.)\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,}$/; 
-1
={10,} 

соответствует =, что повторяется 10 и более раз.

+1

, уверен, что это не займет 10 или более произвольных символов? – Etan

+0

'perl -e 'print« NO », если« abcdefghijklmno »= ~ /. {10,} /;'' – 2009-11-02 11:27:59

+1

У этого есть два upvotes? Это не правильно. – 2009-11-02 11:28:42

2

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

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

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

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

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


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

Hi Jeek and @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 = == о == о === ''. Пожалуйста, не могли бы вы объяснить? Cheers;) – olibre

15

В 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 
+0

если re.search (строка): строка печати (присваивание переменной rxx не обязательно) – dalloliogm

+1

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

1

Вы также можете использовать PowerShell to quickly replace words или символьные reptitions. 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 
0

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

/(.)\1{9,}/ 

или это:

(.)\1{9,} 
-2

Похоже, что регулярное выражение вам нужно, это: 8 = * D

grep -E "8=*D" sampletext 
Смежные вопросы