online number examples example compile python regex unicode regex-negation

number - re.findall python example



python-re: ¿Cómo puedo unir un personaje alfa (3)

Puede usar una de las siguientes expresiones para hacer coincidir una sola letra:

(?![/d_])/w

o

/w(?<![/d_])

Aquí coincido para /w , pero compruebe que [/d_] no coincida antes / después de eso.

De los documentos:

(?!...) Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match ''Isaac '' only if it’s not followed by ''Asimov''. (?<!...) Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length and shouldn’t contain group references. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.

¿Cómo puedo unir un personaje alfa con una expresión regular? Quiero un personaje que está en /w pero no está en /d . Lo quiero compatible con Unicode por eso no puedo usar [a-zA-Z] .


Qué pasa:

/p{L}

Puede utilizar este documento como referencia: Expresiones regulares Unicode

EDITAR: Parece que Python no maneja expresiones Unicode . Eche un vistazo a este enlace: Manejo de caracteres acentuados con expresiones regulares de Python - [AZ] simplemente no es lo suficientemente bueno (ya no está activo, enlace al archivo de internet)

Otras referencias:

Para la posteridad, aquí están los ejemplos en el blog:

import re string = ''riché'' print string riché richre = re.compile(''([A-z]+)'') match = richre.match(string) print match.groups() (''rich'',) richre = re.compile(''(/w+)'',re.LOCALE) match = richre.match(string) print match.groups() (''rich'',) richre = re.compile(''([é/w]+)'') match = richre.match(string) print match.groups() (''rich/xe9'',) richre = re.compile(''([/xe9/w]+)'') match = richre.match(string) print match.groups() (''rich/xe9'',) richre = re.compile(''([/xe9-/xf8/w]+)'') match = richre.match(string) print match.groups() (''rich/xe9'',) string = ''richéñ'' match = richre.match(string) print match.groups() (''rich/xe9/xf1'',) richre = re.compile(''([/u00E9-/u00F8/w]+)'') print match.groups() (''rich/xe9/xf1'',) matched = match.group(1) print matched richéñ


Tus primeras dos oraciones se contradicen entre sí. "in /w pero no está en /d " incluye subrayado. De su tercera oración supongo que no quiere subrayar.

Usar un diagrama de Venn en el reverso de un sobre ayuda. Miremos lo que NO queremos:

(1) caracteres que no coinciden con /w (es decir, no quieren nada que no sea alfa, dígitos ni guiones bajos) => /W
(2) dígitos => /d
(3) subrayado => _

Entonces, lo que no queremos es algo en la clase de caracteres [/W/d_] y, en consecuencia, lo que queremos es cualquier cosa en la clase de caracteres [^/W/d_]

Aquí hay un ejemplo simple (Python 2.6).

>>> import re >>> rx = re.compile("[^/W/d_]+", re.UNICODE) >>> rx.findall(u"abc_def,k9") [u''abc'', u''def'', u''k'']

La exploración adicional revela algunas peculiaridades de este enfoque:

>>> import unicodedata as ucd >>> allsorts =u"/u0473/u0660/u06c9/u24e8/u4e0a/u3020/u3021" >>> for x in allsorts: ... print repr(x), ucd.category(x), ucd.name(x) ... u''/u0473'' Ll CYRILLIC SMALL LETTER FITA u''/u0660'' Nd ARABIC-INDIC DIGIT ZERO u''/u06c9'' Lo ARABIC LETTER KIRGHIZ YU u''/u24e8'' So CIRCLED LATIN SMALL LETTER Y u''/u4e0a'' Lo CJK UNIFIED IDEOGRAPH-4E0A u''/u3020'' So POSTAL MARK FACE u''/u3021'' Nl HANGZHOU NUMERAL ONE >>> rx.findall(allsorts) [u''/u0473'', u''/u06c9'', u''/u4e0a'', u''/u3021'']

U + 3021 (HANGZHOU NUMERAL ONE) se trata como numérico (por lo tanto, coincide con / w) pero parece que Python interpreta "dígito" como "dígito decimal" (categoría Nd) por lo que no coincide / d

U + 2438 (LETRA Y MINÚSCULA LATINA CIRCULADA) no coincide / w

Todos los ideogramas CJK se clasifican como "letras" y por lo tanto coinciden / w

Si cualquiera de los 3 puntos anteriores es una preocupación o no, ese enfoque es el mejor que obtendrás del módulo Re tal como está publicado actualmente. La sintaxis como / p {letter} está en el futuro.