web-dev-qa-db-fra.com

Python regex findall

J'essaie d'extraire toutes les occurrences de mots marqués d'une chaîne en utilisant regex dans Python 2.7.2. Ou simplement, je veux extraire chaque morceau de texte à l'intérieur du [p][/p] Mots clés. Voici ma tentative:

regex = ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?"
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
person = re.findall(pattern, line)

L'impression person produit ['President [P]', '[/P]', '[P] Bill Gates [/P]']

Quelle est la regex correcte à obtenir: ['[P] Barack Obama [/P]', '[P] Bill Gates [/p]'] ou ['Barrack Obama', 'Bill Gates'].

Merci. :)

44
Ignatius
import re
regex = ur"\[P\] (.+?) \[/P\]+?"
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
person = re.findall(regex, line)
print(person)

les rendements

['Barack Obama', 'Bill Gates']

La regex ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?" est exactement le même unicode que u'[[1P].+?[/P]]+?' sauf plus difficile à lire.

Le premier groupe entre crochets [[1P] indique à re que l’un des caractères de la liste ['[', '1', 'P'] devrait correspondre, de même que le deuxième groupe entre crochets [/P]] Ce n'est pas ce que vous voulez du tout. Alors,

  • Supprimez les crochets extérieurs. (Enlevez également le parasite 1 devant P.)
  • Pour protéger les crochets littéraux dans [P], échappe aux crochets avec une barre oblique inverse: \[P\].
  • Pour ne renvoyer que les mots contenus dans les balises, placez les parenthèses de regroupement autour de .+?.
70
unutbu

Essaye ça :

   for match in re.finditer(r"\[P[^\]]*\](.*?)\[/P\]", subject):
        # match start: match.start()
        # match end (exclusive): match.end()
        # matched text: match.group()
14
FailedDev

Votre question n’est pas claire à 100%, mais je suppose que vous voulez trouver chaque élément de texte entre les balises [P][/P]:

>>> import re
>>> line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
>>> re.findall('\[P\]\s?(.+?)\s?\[\/P\]', line)
['Barack Obama', 'Bill Gates']
4
Blair

Utilisez ce motif,

pattern = '\[P\].+?\[\/P\]'

Vérifiez ici

2
Sohn

vous pouvez remplacer votre motif par

regex = ur"\[P\]([\w\s]+)\[\/P\]"
2
pram