Cómo buscar ocurrencias de más de un espacio entre palabras en una línea

109

Cómo buscar ocurrencias de más de un espacio entre palabras en una línea

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

Todos los anteriores son coincidencias válidas para esta expresión regular. ¿Qué expresión regular debo usar?

Sam
fuente
¿Está intentando comprobar los espacios en blanco consecutivos o todos los espacios en esa línea?
Sachin Shanbhag
espacios en blanco consecutivos no todos los espacios
Sam
1
¿Qué quieres decir exactamente con "entre palabras"? En dos de sus ejemplos, hay varios espacios entre una palabra y un dígito. ¿Qué pasa con la puntuación (por ejemplo, desea hacer coincidir varios espacios después de un punto y antes de la siguiente palabra)? ¿Qué pasa con los espacios antes / después del último carácter de una línea? ¿También quieres hacer coincidir las pestañas? ¿Qué pasa con las líneas que no constan más que de espacios en blanco?
Tim Pietzcker
espacios entre "que contiene y 2", "que contiene y 3", "primero y segundo", "segundo y tres" ... Sí, quiero hacer coincidir espacios después de un punto y antes de la siguiente palabra.
Sam

Respuestas:

180
[ ]{2,}

ESPACIO (2 o más)

También puede comprobar que antes y después de esos espacios siguen las palabras. (no otros espacios en blanco como pestañas o nuevas líneas)

\w[ ]{2,}\w

lo mismo, pero también puede elegir (capturar) solo los espacios para tareas como reemplazo

\w([ ]{2,})\w

o ver que antes y después de los espacios hay algo, no solo caracteres de palabra (excepto espacios en blanco)

[^\s]([ ]{2,})[^\s]
AlexanderMP
fuente
1
\wsignifica "caracteres de palabra", es decir, alfanuméricos y guiones bajos, pero no otros caracteres que no sean espacios. Para comprobar si no hay espacios en blanco, utilice \S(S mayúscula). Además, el primero solo coincidirá con líneas que contengan dos o más espacios y nada más.
tdammers
Traté de desarrollar la pregunta. Entendí que me perdí lo que dijiste \S, simplemente prefiero no confiar en el caso de los personajes para tal funcionalidad, es más fácil de leer.
AlexanderMP
1
¿Por qué estás usando anclas? Busca espacios incrustados en algún lugar de las líneas.
Tim Pietzcker
ninguna razón en particular. Al principio pensé que los necesitaba, así que los arrastré durante todo el proceso. De hecho, tiene razón en que me equivoco al usarlos en este caso. Editaré mi respuesta de inmediato.
AlexanderMP
1
\w[ ]{2,}\wno coincidirá word.<2 spaces>more wordso una cadena que consta completamente de espacios. [^\s]([ ]{2,})[^\s]\wfallará en las líneas que comienzan con espacios o cadenas como bla<2 spaces>....
Tim Pietzcker
12

Solución simple:

/\s{2,}/

Esto coincide con todas las apariciones de uno o más caracteres de espacio en blanco. Si necesita hacer coincidir toda la línea, pero solo si contiene dos o más espacios en blanco consecutivos:

/^.*\s{2,}.*$/

Si los espacios en blanco no necesitan ser consecutivos:

/^(.*\s.*){2,}$/
tdammers
fuente
el .*suele ser codicioso, lo que significa que llegará al final de la cadena probada, y todo lo que sigue, si hay caracteres obligatorios, no coincidirá. Por lo general, en este caso, es una buena práctica agregar ?, como este .*?. Me pasó usando PCRE de PHP
AlexanderMP
Coincide. "Codicioso" significa que coincide tanto como sea posible sin dejar de coincidir con el patrón como un todo. /^.*b.*$/de hecho "foobar", coincide , aunque esperaría que el primer codicioso ya .*coincida con toda la cadena.
tdammers
9

Esta expresión regular selecciona todos los espacios, puede usar esto y reemplazarlo con un solo espacio

\s+

ejemplo en python

result = re.sub('\s+',' ', data))
Owen Yuwono
fuente
4

Buscar [ ]{2,}. Esto encontrará dos o más espacios adyacentes en cualquier lugar dentro de la línea. También coincidirá con los espacios iniciales y finales, así como con las líneas que constan completamente de espacios. Si no quieres eso, mira la respuesta de Alexander.

En realidad, puede omitir los corchetes, son solo para mayor claridad (de lo contrario, el carácter de espacio que se repite no es tan visible :)).

El problema con \s{2,}es que también coincidirá con las líneas nuevas en los archivos de Windows (donde las líneas nuevas se indican con CRLFo con las \r\nque coinciden \s{2}.

Si también desea buscar varias pestañas y espacios, utilice [ \t]{2,}.

Tim Pietzcker
fuente
more than one space between words in a line. ¿Cómo es [ ]{2,}entre palabras? ¿Has leído siquiera la pregunta?
AlexanderMP
Es por eso que me he referido a su respuesta en caso de que el OP realmente quiera ser tan estricto como está escribiendo. Quizás deberíamos preguntarle.
Tim Pietzcker
2

Aqui esta mi solucion

[^0-9A-Z,\n]

Esto eliminará todos los dígitos, comas y nuevas líneas, pero seleccionará el espacio intermedio, como el conjunto de datos de

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Ojitha
fuente