#python
Вопрос:
Я ищу простое регулярное выражение, которое соответствовало бы одному и тому же символу, повторяемому более 10 или около того раз. Так, например, если у меня есть документ, испещренный горизонтальными линиями:
=================================================
Он будет соответствовать строке =
символов, потому что он повторяется более 10 раз. Обратите внимание, что я бы хотел, чтобы это работало для любого персонажа.
Комментарии:
1. название этого asnwer вводит в заблуждение, вы должны были сказать «Регулярное выражение для соответствия любому символу, повторяемому более 10 раз».
Ответ №1:
Регулярное выражение, которое вам нужно, таково /(.)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,}$/;
Ответ №2:
В 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
Комментарии:
1. если повторно выполнить поиск(строка): выведите строку (присвоение переменной rxx не требуется)
2. Вы правы в этом простом контексте. Используя переменную rxx, я могу сделать что-то вроде rxx.group(1), rxx.start(1) и т. Д.
Ответ №3:
.
соответствует любому персонажу. Используется в сочетании с уже упомянутыми фигурными скобками:
$: cat > test
========
============================
oo
ooooooooooooooooooooooo
$: grep -E '(.)1{10}' test
============================
ooooooooooooooooooooooo
Комментарии:
1. Привет, Джик и @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==='
. Пожалуйста, не могли бы вы объяснить? Ура 😉
Ответ №4:
В некоторых приложениях вам нужно удалить косые черты, чтобы это сработало.
/(.)1{9,}/
или это:
(.)1{9,}
Ответ №5:
={10,}
совпадения =
, которые повторяются 10 или более раз.
Комментарии:
1. уверены, что для этого не требуется 10 или более произвольных символов?
2.
perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'
3. это было неправильно, но оно было отредактировано (в соответствии с моим ответом, который получил несколько отрицательных отзывов, хорошо).
4. Боже, не знал, что я должен был прямо сказать, что вы можете заменить персонажа всем, чем захотите.
Ответ №6:
используйте оператор {10,} :
$: cat > testre
============================
==
==============
$: grep -E '={10,}' testre
============================
==============
Ответ №7:
Вы также можете использовать PowerShell для быстрой замены слов или повторений символов. PowerShell предназначен для Windows. Текущая версия-3.0.
$oldfile = "$env:windirWindowsUpdate.log"
$newfile = "$env:tempnewfile.txt"
$text = (Get-Content -Path $oldfile -ReadCount 0) -join "`n"
$text -replace '/(.)1{9,}/', ' ' | Set-Content -Path $newfile
Ответ №8:
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 последовательных повторяющихся символов, вывод:
мохерб ее
Ответ №9:
Немного более общий пример powershell. В powershell 7 соответствие подсвечивается, включая последний пробел (вы можете выделить в стеке?).
'a b c d e f ' | select-string '([a-f] ){6,}'
a b c d e f