Question

Je suis un peu de difficulté concocter un regex qui produit ce résultat:

Mike 1 , misha 1,2 , Miguel 1,2,3,4,5,6,7,18 , et michea 2,3

Comment peut-on pas en arrière dans regex et jeter le dernier match? C'est je besoin d'une virgule avant un espace pour ne pas correspondre. Ce que je suis venu avec ...

\d+(,|\r)

Mike 1, misha 1,2, miguel 1,2,3,4,5,6,7,18, et Michael 2,3

Était-ce utile?

La solution

La fonction regex vous demandez au sujet est appelé positif lookbehind. Mais dans votre cas, je ne pense pas que vous en avez besoin. Essayez ceci:

\d+(?:,\d+)*

Dans votre exemple, cela correspondra à la liste délimitée par des virgules de nombres et d'exclure les noms et les virgules et les espaces de fin.

Voici un petit morceau de code de test écrit en PHP qui permet de vérifier sur votre entrée:

<?php
$input = "Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Micheal2,3";
$matches = array();
preg_match_all('/\d+(?:,\d+)*/', $input, $matches);
print_r($matches[0]);
?>

sorties:

Array
(
    [0] => 1
    [1] => 1,2
    [2] => 1,2,3,4,5,6,7,18
    [3] => 2,3
)

Autres conseils

Je crois que \d+,(?!\s) fera ce que vous voulez. Le ?! est un lookahead négatif , qui correspond seulement si ce qui suit le fait ?! pas apparaissent à cette position dans la chaîne de recherche.

>>> re.findall(r'\d+,(?!\s)', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3')
['1,', '1,', '2,', '3,', '4,', '5,', '6,', '7,', '2,']

Ou si vous voulez correspondre à la liste séparée par des virgules des numéros à l'exception de l'utilisation de virgule finale \d+(?:,\d+)*.

>>> re.findall(r'\d+(?:,\d+)*', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3')
['1', '1,2', '1,2,3,4,5,6,7,18', '2,3']
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top