Chevauchement d'expressions régulières en Python et Java

référence: https://stackoverflow.com/questions/17971466/java-regex-overlapping-matches

Normalement, lors de la mise en correspondance d'une expression régulière, la partie de chaîne de caractères adoptée dans une correspondance n'est pas utilisée deux fois dans une autre correspondance. Par exemple, à partir de la chaîne " _apple_banana_cherry_ " Si vous correspondez à / _ [^ _] + _ /, vous pouvez obtenir deux choses, _apple_ et _cherry_. Si vous voulez utiliser le chevauchement "\ _" pour en prendre trois, _apple_, _banana_ et _cherry_, vous devez en spécifier un spécial.

Pour python

Un moyen simple est d'utiliser le package d'expressions régulières regex et de faire correspondre avec l'option ʻoverlapped = True`.

{.python}


>>> import regex as re
>>> re.findall("_[^_]+_", "_apple_banana_cherry_")
['_apple_', '_cherry_']
>>> re.findall("_[^_]+_", "_apple_banana_cherry_", overlapped=True)
['_apple_', '_banana_', '_cherry_']

Pour Java

Dans le cas de Java, il est facile d'utiliser le package d'expressions régulières standard et de décaler startIndex.

{.java}


Matcher m = Pattern.compile("_[^_]+(_)").matcher("_apple_banana_cherry_");
if (m.find()) {
    do {
        System.out.println(m.group());
    } while (m.find(m.start(1)));
}

Commentaire: Avec / _ [^ _] + (_) /, le second _ apparaissant est entouré de () afin qu'il puisse être acquis comme groupe 1. m.start (1) renvoie le premier index du groupe 1. «m.find (N)» signifie démarrer le match à partir du Nième caractère. Donc m.find (m.start (1)) signifie démarrer m.find () à partir du premier index du groupe 1. En d'autres termes, dans la deuxième boucle et les suivantes, la correspondance suivante est lancée à partir de «_» à la fin de la chaîne de caractères correspondante.

note: Il peut être plus facile d'utiliser un groupe nommé pour spécifier quel groupe sera le premier index pour la prochaine correspondance.

{.example}


(?<name>PATTERN)

Vous pouvez également avoir besoin d'un groupe sans capture pour des modèles de correspondance plus complexes.

{.example}


(?:PATTERN)

Recommended Posts

Chevauchement d'expressions régulières en Python et Java
À propos de Python et des expressions régulières
Lors de l'utilisation d'expressions régulières en Python
[Python] Expressions régulières Expressions régulières
différence entre les instructions (instructions) et les expressions (expressions) en Python
Différences entre la syntaxe Python et Java
Remplacer non-ASCII par des expressions régulières en Python
N'utilisez pas \ d dans les expressions régulières Python 3!
Comment utiliser les expressions régulières en Python
Expressions régulières faciles et solides à apprendre en Python
Expression régulière en Python
Un chercheur d'une société pharmaceutique a résumé les expressions canoniques en Python
J'ai écrit une classe en Python3 et Java
Expression de régression multiple en Python
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
Utiliser des expressions régulières en C
J'ai comparé Java et Python!
Envelopper de longues expressions en python
Pile et file d'attente en Python
Unittest et CI en Python
Distribution de Poisson et tracé de distribution cumulative de Poisson via sqlite en Python et Java
Débarrassez-vous des données sales avec Python et les expressions régulières
J'ai essayé de programmer le test du chi carré en Python et Java.
Supprimez les espaces de début et de fin en Python, JavaScript ou Java
Trouvons un graphique de la distribution de Poisson et de la distribution cumulative de Poisson en Python et Java, respectivement.
Détectez et traitez les signaux en Java.
Inclusions de tapple Python et expressions de générateur
Différence entre java et python (mémo)
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Différence entre list () et [] en Python
Comparaison de la grammaire de base entre Java et Python
Différence entre == et est en python
Afficher les photos en Python et html
Algorithme de tri et implémentation en Python
Je ne me souviens pas des expressions régulières Python
Manipuler des fichiers et des dossiers en Python
À propos de Python et Cython dtype
A propos des modules Python Primer et des expressions conditionnelles
Affectations et modifications des objets Python
Vérifiez et déplacez le répertoire en Python
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Hashing de données en R et Python
Synthèse de fonctions et application en Python
Exporter et exporter des fichiers en Python
Inverser le pseudonyme plat et le katakana en Python2.7
Lire et écrire du texte en Python
[GUI en Python] Menu PyQt5 et barre d'outils-
Gestion des expressions régulières par PHP / Python
Créer et lire des paquets de messages en Python
Un mémo qui gère les guillemets doubles pleine largeur avec les expressions régulières Python
Résolution en Ruby, Python et Java AtCoder ABC141 D Priority Queue
Comment afficher les octets de la même manière en Java et Python
Différence d'authenticité entre Python et JavaScript
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Les modules et packages en Python sont des "espaces de noms"
Évitez les boucles imbriquées en PHP et Python
Différences entre Ruby et Python dans la portée
Modulation et démodulation AM avec Python Partie 2
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>