2009-11-02 27 views
58

Busco un simple expresión regular para que coincida con el mismo carácter que se repite más de 10 veces o así. Así, por ejemplo, si tengo un documento lleno de líneas horizontales:Expresión regular para que coincida con cualquier carácter que se repite más de 10 veces

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

que coincidirá con la línea de = caracteres, ya que se repite más de 10 veces. Nota que me gustaría que esto funcione para cualquier carácter.

+1

el título de este asnwer es engañosa, que debería haber dicho 'Regular expresión para que coincida con cualquier carácter repetido más de 10 veces ' – dalloliogm

Respuesta

102

La expresión regular que necesita es /(.)\1{9,}/.

prueba:

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

Aquí el \1 se llama una referencia inversa. Se hace referencia a lo que es capturado por el punto . entre los soportes (.) y entonces el {9,} pide nueve o más del mismo carácter. Por lo tanto, esto coincide con diez o más de un solo personaje.

Aunque la escritura de la prueba anterior es en Perl, esta es la sintaxis de expresiones regulares muy estándar y debería funcionar en cualquier idioma. En algunas variantes, es posible que necesite utilizar más barras diagonales inversas, p. Emacs haría usted escribe \(.\)\1\{9,\} aquí.

Si una frase entera debe constar de 9 o más idénticos caracteres, añadir anclajes alrededor del patrón:

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

coincide con = que se repite 10 o más veces.

+1

Asegúrese de que esto no toma 10 o más caracteres arbitrarios? – Etan

+0

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

+1

¿Esto tiene dos votos favorables? Está incorrecto. –

2

utilizan el {10} operador:

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

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

. coincide con cualquier carácter. Utilizado conjuntamente con las llaves ya mencionados: (.) ​​

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


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

Hola Jeek y @SilentGhost. Los dos comandos 'grep -E '([= o]) \ 1 {10}' test' y' grep -E '([= o]) {10}' test' funcionan bien con su ejemplo (tenga en cuenta la falta de '\ 1' en el segundo comando). Pero el comando 'grep -E '([= o]) \ 1 {10}' <<< '== o == o == o == o == o == o === o == o = == ''no coincide con la línea! Sin embargo, el comando sin '\ 1' coincide con la línea:' grep -E '([= o]) {10}' <<< '== o == o == o == o == o == o = == o == o === ''. Por favor podrías explicarme? Cheers;) – olibre

15

En Python se puede utilizar (.)\1{9,}

  • hace que el grupo de un char (cualquier char)
  • \ 1 {9} partidos nueve o más caracteres del 1er grupo

ejemplo:

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 

Salida:

1. aaaaaaaaaaaaaaa 
3. cccccccccccccccccccc 
5. eeeeeeeeeeee 
+0

if re.search (línea): línea de impresión (la asignación a la variable rxx no es necesaria) – dalloliogm

+1

Tiene razón en este contexto simple. Usando la variable rxx puedo hacer algo como rxx.group (1), rxx.start (1), etc. –

1

También puede utilizar PowerShell to quickly replace words o caracteres reptitions. PowerShell es para Windows. La versión actual es 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

En algunas aplicaciones, necesita quitar las barras para que funcione.

/(.)\1{9,}/ 

o esto:

(.)\1{9,} 
-2

Parece que la expresión regular que necesita es: 8 = * D

grep -E "8=*D" sampletext 
Cuestiones relacionadas