Al hacer coincidir una dirección de correo electrónico, después de que coincida con algo como [email protected]
, quiero capturar uno o más de (\.\w+)
(lo que estoy haciendo es un poco más complicado, esto es solo un ejemplo), Intenté agregar (. \ W +) +, pero solo captura el último partido. Por ejemplo, [email protected]
coincide pero solo incluye .tr
después de [email protected]
parte, por lo que perdí .something
y .edu
grupos. ¿Puedo hacer esto en expresiones regulares de Python, o sugeriría que coincida con todo al principio, y dividiría los subpatrones más tarde?Captura de subpatterns repetitivos en Python regex
Respuesta
Puede solucionar el problema de la captura de (\.\w+)+
solamente el último partido al hacer esto en su lugar: ((?:\.\w+)+)
esto funcionará:
>>> regexp = r"[\w\.][email protected](\w+)(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?"
>>> email_address = "[email protected]"
>>> m = re.match(regexp, email_address)
>>> m.groups()
('galactica', '.caprica', '.fleet', '.mil', None, None)
Pero es limitada a un máximo de seis subgrupos. Una mejor manera de hacer esto sería:
>>> m = re.match(r"[\w\.][email protected](.+)", email_address)
>>> m.groups()
('galactica.caprica.fleet.mil',)
>>> m.group(1).split('.')
['galactica', 'caprica', 'fleet', 'mil']
Tenga en cuenta que las expresiones regulares son bien siempre y cuando las direcciones de correo electrónico son simples - pero hay todo tipo de cosas que este se romperá para. Ver this question para un tratamiento detallado de expresiones regulares de dirección de correo electrónico.
módulore
no soporta capturas repetidas (regex
lo soporta):
>>> m = regex.match(r'([.\w]+)@((\w+)(\.\w+)+)', '[email protected]')
>>> m.groups()
('yasar', 'webmail.something.edu.tr', 'webmail', '.tr')
>>> m.captures(4)
['.something', '.edu', '.tr']
En su caso me gustaría ir con la división de los sub-patrones repetidos después. Conduce a un código simple y legible, por ejemplo, vea el código en @Li-aung Yip's answer.
Por curiosidad, ¿cómo se escribe un patrón de reemplazo cuando se combinan las capturas repetidas? ¿El significado de '\ 1',' \ 2', '\ 3' etc. cambia dependiendo de cuántas veces coincide' (\. \ W +) '? –
@ Li-aung Yip: '\ 1' corresponde a' m.group (1) '; el significado no ha cambiado Puede usar una función como patrón de reemplazo y llamar 'm.captures()' en ella. – jfs
En su ejemplo, el significado de '\ 1',' \ 2' y '\ 3' es obvio porque solo capturan una vez. ¿Pero cuál es el significado de '\ 4', que corresponde a' (\. \ W +) + '? '\ 4' parece ser" la última subcadena que coincide con el 4º grupo de captura ", en este caso' .tr'. –
esto es lo que están buscando:
>>> import re
>>> s="[email protected]"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)
>>> m
['.something', '.edu', '.tr']
- 1. Usar subpatterns en FINDSTR
- 2. grupo de captura java regex
- 3. Java regex: grupos de captura de repetición
- 4. Scala Regex Captura de múltiples bloques
- 5. Ruby Regex vs Python Regex
- 6. Regex llamado grupos de captura en Delphi XE
- 7. ¿Cómo incluir grupos de captura con nombre en java regex?
- 8. Captura de grupo Regex en R con múltiples grupos de captura
- 9. Captura genérica para python
- 10. WPF elementos repetitivos
- 11. Números aleatorios no repetitivos
- 12. .NET regex no captura en el orden esperado
- 13. Captura de todas las excepciones en Python
- 14. Captura de pantalla en Python - Cross Platform
- 15. Python/Regex - Match. #, #. en String
- 16. Eliminar dígitos en Python (Regex)
- 17. Estándar Regex vs python regex discrepancia
- 18. Reemplazo de Java Regex con el grupo de captura
- 19. ¿Qué es un "grupo de captura independiente" regex?
- 20. Python regex parse stream
- 21. Python regex findall
- 22. Python RegEx grupos múltiples
- 23. Python regex para entero?
- 24. python multiline regex
- 25. Python regex string matching?
- 26. Python: reemplazar con regex
- 27. Python regex - r prefijo
- 28. regex para que coincida con una palabra con caracteres únicos (no repetitivos)
- 29. comportamiento extraño de Python Regex
- 30. Separación de cadenas en Python usando regex
Para las abreviaturas (si has entubados inferior): 're.sub (ur '((:?. [Az] \) {2, }) ', lambda m: m.group (1) .replace ('. ',' '), text) ' – bahmait
Gracias. Pude agregar los paréntesis que me permitían hacer coincidir un subpatrón repetido, pero luego había un grupo en el partido con el último del patrón. No había visto que '(?: ...)' hace un grupo que no captura. https://docs.python.org/2/library/re.html#regular-expression-syntax Agregando que corrige ese problema. –