Excluir personajes de una clase de personaje

¿Hay una manera simple de unir todos los personajes de una clase, excepto un cierto conjunto de ellos? Por ejemplo, si en un idioma donde puedo usar \ w para unir el conjunto de todos los caracteres de una palabra Unicode, ¿hay alguna forma de excluir un carácter como un guión bajo “_” de esa coincidencia?

La única idea que me vino a la mente fue usar una mirada negativa detrás de cada personaje, pero parece más complejo de lo necesario cuando de hecho solo quiero unir un personaje con un resultado positivo Y una coincidencia negativa. Por ejemplo, si & was an AND operator pudiera hacer esto …

^(\w&[^_])+$ 

Realmente depende de tu sabor regex.

.RED

… proporciona solo una operación de conjunto de clases de caracteres simples: resta . Esto es suficiente para su ejemplo, así que simplemente puede usar

 [\w-[_]] 

Si a - es seguido por una clase de caracteres nesteds, se resta. Simple como eso…

Java

… proporciona un conjunto mucho más rico de operaciones de conjuntos de clases de caracteres . En particular, puede obtener la intersección de dos conjuntos como [[abc]&&[cde]] (lo que daría c en este caso). Intersección y negación juntas te dan sustracción:

 [\w&&[^_]] 

Todos los otros sabores

… (que admite lookaheads) le permite imitar la resta utilizando un lookahead negativo:

 (?!_)\w 

Esto primero comprueba que el siguiente carácter no es un _ y luego coincide con cualquier \w (que no puede ser _ debido a la anticipación negativa).

Tenga en cuenta que cada uno de estos enfoques es completamente general, ya que puede restar dos clases de caracteres arbitrariamente complejas.

Puede usar una negación de la clase \w (-> \W ) y excluirla:

 ^([^\W_]+)$ 

Una mirada negativa hacia adelante es la forma correcta de hacerlo en la medida en que entiendo su pregunta:

 ^((?!_)\w)+$ 

Intenta usar la resta

 [\w&&[^_]]+ 

Nota: Esto funcionará en Java, pero puede que no en algún otro motor Regex.

Esto se puede hacer en python con el módulo regex . Algo como:

 import regex as re pattern = re.compile(r'[\W_--[ ]]+') cleanString = pattern.sub('', rawString) 

Normalmente instalarías el módulo regex con pip :

 pip install regex 

EDITAR :

El módulo regex tiene dos comportamientos, versión 0 y versión 1. Establecer sustracción (como arriba) es un comportamiento de versión 1. La demanda de pypi docs versión 1 es el comportamiento predeterminado, pero puede encontrar que este no es el caso. Puedes consultar con

 import regex if regex.DEFAULT_VERSION == regex.VERSION1: print("version 1") 

Para configurarlo en la versión 1:

 regex.DEFAULT_VERSION = regex.VERSION1 

o para usar la versión uno en una sola expresión:

 pattern = re.compile(r'(?V1)[\W_--[ ]]+')