Moteur Python Regex - "Look-behind requiert un modèle à largeur fixe" Erreur
Je suis à tenter de gérer les non-correspondance des guillemets dans une chaîne de caractères au format CSV.
Pour être précis,
"It "does "not "make "sense", Well, "Does "it"
doit être corrigée comme
"It" "does" "not" "make" "sense", Well, "Does" "it"
Donc, fondamentalement, ce que je suis en train de faire est de
remplacer tous les '" '
- Pas précédé par un début de ligne ou une virgule (et)
- Pas suivi d'une virgule ou une fin de ligne
avec '"" '
Pour que j'utilise le ci-dessous regex
(?<!^|,)"(?!,|$)
Le problème est alors que Ruby regex moteurs ( http://www.rubular.com/ ) sont en mesure d'analyser les regex, python regex moteurs (https://pythex.org/ , http://www.pyregex.com/) de jeter l'erreur suivante
Invalid regular expression: look-behind requires fixed-width pattern
Et avec python 2.7.3 il jette
sre_constants.error: look-behind requires fixed-width pattern
Quelqu'un peut me dire ce que vexes python ici?
==================================================================================
EDIT :
Suivantes Tim réponse, j'ai eu le dessous de la sortie d'un multi-ligne de chaîne
>>> str = """ "It "does "not "make "sense", Well, "Does "it"
... "It "does "not "make "sense", Well, "Does "it"
... "It "does "not "make "sense", Well, "Does "it"
... "It "does "not "make "sense", Well, "Does "it" """
>>> re.sub(r'\b\s*"(?!,|$)', '" "', str)
' "It" "does" "not" "make" "sense", Well, "Does" "it" "\n"It" "does" "not" "make" "sense", Well, "Does" "it" "\n"It" "does" "not" "make" "sense", Well, "Does" "it" "\n"It" "does" "not" "make" "sense", Well, "Does" "it" " '
À la fin de chaque ligne, à côté de "elle", deux guillemets ont été ajoutés.
J'ai donc fait un très petit changement à la regex pour gérer une nouvelle ligne.
re.sub(r'\b\s*"(?!,|$)', '" "', str,flags=re.MULTILINE)
Mais cela donne à la sortie
>>> re.sub(r'\b\s*"(?!,|$)', '" "', str,flags=re.MULTILINE)
' "It" "does" "not" "make" "sense", Well, "Does" "it"\n... "It" "does" "not" "make" "sense", Well, "Does" "it"\n... "It" "does" "not" "make" "sense", Well, "Does" "it"\n... "It" "does" "not" "make" "sense", Well, "Does" "it" " '
Le dernier "elle", lui seul, a deux guillemets.
Mais je me demande pourquoi le '$' caractère de fin de ligne ne permettent pas d'identifier que la ligne est terminée.
==================================================================================
La réponse finale est
re.sub(r'\b\s*"(?!,|[ \t]*$)', '" "', str,flags=re.MULTILINE)
source d'informationauteur SpikETidE
Vous devez vous connecter pour publier un commentaire.
Python les assertions arrières doivent être de largeur fixe, mais vous pouvez essayer ceci:
Explication:
Python lookbehinds vraiment besoin d'être à largeur fixe, et quand vous avez des alternances dans un lookbehind motif qui sont de longueur différente, il y a plusieurs façons de gérer cette situation:
(?<=[^,])"(?!,|$)
de votre modèle actuel qui nécessite un char d'autres qu'une virgule avant le guillemet, ou d'un modèle commun pour correspondre mots entourés par des espaces,(?<=\s|^)\w+(?=\s|$)
peut être écrite comme(?<!\S)\w+(?!\S)
), ou(?<=a|bc)
devrait être réécrit comme(?:(?<=a)|(?<=bc))
)(?<!^|,)"(?!,|$)
devrait ressembler à(?<!^)(?<!,)"(?!,|$)
).