2009-11-02 4 views
58

Je cherche une expression régulière simple pour correspondre au même caractère répété plus de 10 fois. Ainsi, par exemple, si j'ai un document jonché de lignes horizontales:Expression régulière pour correspondre à tout caractère répété plus de 10 fois

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

Il correspondra à la ligne de = caractères, car il est répété plus de 10 fois. Notez que je voudrais que cela fonctionne pour un caractère.

+1

le titre de ce asnwer est trompeur, vous devriez avoir dit « régulier expression pour correspondre à tout caractère répété plus de 10 fois ' – dalloliogm

Répondre

102

Le regex dont vous avez besoin est /(.)\1{9,}/.

Test:

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

Ici, le \1 est appelé backreference. Il fait référence à ce qui est capturé par le point . entre les parenthèses (.), puis le {9,} demande neuf ou plus du même caractère. Ainsi, cela correspond à dix ou plus d'un seul caractère.

Bien que le script de test ci-dessus soit en Perl, il s'agit d'une syntaxe regex très standard qui devrait fonctionner dans n'importe quel langage. Dans certaines variantes, vous devrez peut-être utiliser davantage de barres obliques inverses, par ex. Emacs vous ferait écrire \(.\)\1\{9,\} ici.

Si une chaîne entière devrait être composé de 9 ou plusieurs caractères identiques, ajouter des ancres autour du modèle:

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

correspond à = qui est répété 10 fois ou plus.

+1

sûr que cela ne prend pas 10 caractères arbitraires ou plus? – Etan

+0

'perl -e 'imprimer" NON "si" abcdefghijklmno "= ~ /. {10,} /;'' –

+1

Cela a eu deux upvotes? C'est faux. –

2

utiliser le {10,} opérateur:

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

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

. correspond à tout caractère. Utilisé conjointement avec les accolades déjà mentionnées: (.) ​​

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


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

Salut Jeek et @SilentGhost. Les deux commandes 'grep -E '([= o]) \ 1 {10}' test' et' grep -E '([= o]) {10}' test' fonctionne bien avec votre exemple (notez le manque de '\ 1' dans la deuxième commande). Mais la commande 'grep -E '([= o]) \ 1 {10}' <<< '== o == o == o == o == o == o === o == o = == ''ne correspond pas à la ligne! Cependant, la commande sans '1 'correspond à la ligne:' grep -E' ([= o]) {10} '<<<' == o == o == o == o == o == o = == o == o === ''. S'il vous plaît pourriez-vous expliquer? Salutations;) – olibre

15

En Python vous pouvez utiliser (.)\1{9,}

  • fait groupe d'un char (tout char)
  • \ 1 {9,} correspond à neuf ou plusieurs personnages du 1er groupe

exemple:

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 

Sortie:

1. aaaaaaaaaaaaaaa 
3. cccccccccccccccccccc 
5. eeeeeeeeeeee 
+0

si re.search (ligne): ligne d'impression (la variable assignemnt à la variable rxx n'est pas nécessaire) – dalloliogm

+1

Vous avez raison dans ce contexte simple. En utilisant la variable rxx, je peux faire quelque chose comme rxx.group (1), rxx.start (1) etc. –

1

Vous pouvez également utiliser PowerShell to quickly replace words ou caractère reptitions. PowerShell est pour Windows. La version actuelle est 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

Sur certaines applications, vous devez supprimer les barres obliques pour que cela fonctionne.

/(.)\1{9,}/ 

ou ceci:

(.)\1{9,} 
-2

Il semble que le regex dont vous avez besoin est: 8 = * D

grep -E "8=*D" sampletext 
Questions connexes