-4
votes

Diviser une chaîne en majuscules, mais uniquement si une lettre minuscule suit en Python

J'utilise pdfminer.six en Python pour extraire de longues données texte. Malheureusement, le Miner ne fonctionne pas toujours très bien, en particulier avec les paragraphes et l'habillage de texte. Par exemple, j'ai la sortie suivante:

"2018Annual ReportInvesting for Growth and Market LeadershipOur CEO will provide you with all further details below."

--> "2018 Annual Report Investing for Growth and Market Leadership Our CEO will provide you with all further details below."

Maintenant, je voudrais insérer un espace chaque fois qu'une lettre minuscule est suivie d'une lettre majuscule, puis d'une lettre plus petite (et pour les nombres). Si bien qu'à la fin "2018Annual" devient "2018 Annual" et "ReportInvesting" devient "Report Investing" , mais "...CEO..." reste "...CEO..." .

J'ai seulement trouvé des solutions pour diviser une chaîne en lettres majuscules et https://stackoverflow.com/a/3216204/14635557 mais je n'ai pas pu la réécrire. Malheureusement, je suis totalement nouveau dans le domaine de Python.


3 commentaires

voir stackoverflow.com/help/how-to-ask


Même si vous êtes nouveau dans le codage Python, vous devriez toujours essayer de coder et publier ce que vous avez essayé avant de demander des solutions


compris, essaiera de l'améliorer la prochaine fois


3 Réponses :


5
votes

Nous pouvons essayer d'utiliser re.sub ici pour une approche regex:

(?<![A-Z\W])  what precedes is a word character EXCEPT
              for capital letters
(?=[A-Z])     and what follows is a capital letter

Cela imprime:

2018 Annual Report Investing for Growth and Market Leadership Our CEO will provide you with all further details below.

Le regex utilisé ici dit d'insérer un espace à tout moment pour lequel:

inp = "2018Annual ReportInvesting for Growth and Market LeadershipOur CEO will provide you with all further details below."
inp = re.sub(r'(?<![A-Z\W])(?=[A-Z])', ' ', inp)
print(inp)


0 commentaires

0
votes

Essayez de diviser avec regex:

import re
temp = re.sub(r"([A-Z][a-z]+)", r"\1", string).split()

string = ' '.join(temp)


0 commentaires

0
votes

Je crois que le code ci-dessous donne le résultat requis.

temp = re.sub(r"([a-z])([A-Z])", r"\1 \2", text)
temp = re.sub(r"(\d)([A-Za-z])", r"\1 \2", temp)

Je trouve toujours les expressions régulières complexes un peu difficiles, d'où la nécessité de diviser le processus en deux expressions. Peut-être que quelqu'un de meilleur dans les expressions régulières peut améliorer cela pour montrer comment cela peut être réalisé de manière plus élégante.


0 commentaires