J'ai un fichier dont le format est modifié par un script python. J'ai plusieurs chaînes camel dans ce fichier où je veux juste insérer un seul espace avant la lettre majuscule - ainsi "WordWordWord" devient "Word Word Word". Mon expérience d'expression rationnelle limitée s'est arrêtée sur moi - quelqu'un peut-il penser à une regex décente pour le faire, ou (mieux encore) y at-il une façon plus pythonique de faire cela que je manque?Je cherche une façon pythonique d'insérer un espace avant les lettres majuscules
Répondre
Vous pouvez essayer:
>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWord")
'Word Word Word'
Avec regexes vous pouvez faire ceci:
re.sub('([A-Z])', r' \1', str)
Bien sûr, cela ne fonctionne que pour les caractères ASCII, si vous voulez faire Unicode c'est un tout nouveau boîte de vers :-)
re.sub ('([A-Z])', r '\ 1', "Voulons-nous un espace avant les D de cette phrase?") – tzot
Ah, oui, bon point. On dirait que les solutions de Leonhard et de Leonhard sont correctes. –
S'il y a des majuscules consécutives, alors le résultat de Greg pourrait ne pas être ce que vous cherchez, puisque le \ w consomme le caractère devant la lettre capitale à remplacer.
>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWWWWWWWord")
'Word Word WW WW WW Word'
Un regard-behind résoudrait ceci:
>>> re.sub(r"(?<=\w)([A-Z])", r" \1", "WordWordWWWWWWWord")
'Word Word W W W W W W Word'
Jetez un oeil à ma réponse sur .NET - How can you split a “caps” delimited string into an array?
Edit: Peut-être mieux l'inclure ici.
re.sub(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))', r'\1 ', text)
Par exemple:
"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
Votre réponse est probablement ce que veut réellement Electrons_Ahoy; Cependant, selon le libellé de leur question, ce n'est pas le cas. – tzot
mais merci de partager celui-ci, c'est une réponse géniale! –
Peut-être plus court:
>>> re.sub(r"\B([A-Z])", r" \1", "DoIThinkThisIsABetterAnswer?")
Pour quiconque se demandant, '\ B' est" Pas de limite de mot ". Donc, ce n'est pas insérer des espaces où il y a déjà un espace. – ArtOfWarfare
Je suis d'accord que la solution de regex est le plus facile, mais je ne dirais pas que c'est le plus pythonique.
Que diriez-vous:
text = 'WordWordWord'
new_text = ''
for i, letter in enumerate(text):
if i and letter.isupper():
new_text += ' '
new_text += letter
Je pense que regexes sont le chemin à parcourir, mais juste pour donner une version pure python sans (je l'espère) l'un des problèmes ΤΖΩΤΖΙΟΥ a souligné:
def splitCaps(s):
result = []
for ch, next in window(s+" ", 2):
result.append(ch)
if next.isupper() and not ch.isspace():
result.append(' ')
return ''.join(result)
fenêtre
() est une fonction d'utilité j'utilise pour fonctionner sur une fenêtre glissante d'éléments, définis comme:
import collections, itertools
def window(it, winsize, step=1):
it=iter(it) # Ensure we have an iterator
l=collections.deque(itertools.islice(it, winsize))
while 1: # Continue till StopIteration gets raised.
yield tuple(l)
for i in range(step):
l.append(it.next())
l.popleft()
Peut-être que vous seriez intéressé par la mise en œuvre d'un revêtement sans utiliser regexp:
''.join(' ' + char if char.isupper() else char.strip() for char in text).strip()
Si vous avez des acronymes, vous ne voulez probablement pas d'espace entre eux.Ce regex deux étapes gardera intact acronymes (et traiter également des signes de ponctuation et d'autres lettres non en majuscules comme quelque chose à ajouter un espace):
re_outer = re.compile(r'([^A-Z ])([A-Z])')
re_inner = re.compile(r'(?<!^)([A-Z])([^A-Z])')
re_outer.sub(r'\1 \2', re_inner.sub(r' \1\2', 'DaveIsAFKRightNow!Cool'))
La sortie sera: 'Dave Is AFK Right Now! Cool'
- 1. URL de navigation Sharepoint dans toutes les lettres majuscules
- 2. La façon la plus pythonique d'étendre une liste potentiellement incomplète
- 3. Comment trouver toutes les occurrences de lettres majuscules, d'espaces et de nombres dans une recherche mysql?
- 4. Je cherche un moyen de piéger les instructions CPUID
- 5. Je cherche un menu sur JQuery
- 6. MS Access Inner Join ne reconnaît pas la différence entre les lettres minuscules et majuscules?
- 7. Quelle regex va mettre en majuscule les lettres qui suivent un espace?
- 8. Je cherche un panier ASP.net léger et compatible avec PayPal
- 9. Quelle est la façon la plus pythonique de déterminer l'endianisme?
- 10. Je cherche une bibliothèque d'interface graphique d'application pour C++
- 11. Je cherche un moyen générique pour gérer les rapports Linq et retourner les résultats en XML
- 12. Je cherche une alternative à TortoiseHG sous Win32
- 13. Je cherche une librairie de vérification orthographique Java
- 14. Je cherche des schémas idiomatiques pour Scheme
- 15. Je cherche un utilitaire "Rechercher/Rechercher" VisualStudio2008 qui affiche les résultats dans un contexte
- 16. Je cherche un exemple simple de code MEF
- 17. ZedGraph - Je cherche un exemple d'utilisation d'un DateTime
- 18. Je cherche des exemples de projets BlackBerry
- 19. Trouver toutes les majuscules dans les colonnes?
- 20. Quelqu'un peut-il fournir une façon plus pythonique de générer la séquence Morris?
- 21. quelle est la meilleure façon de php pour inverser les lettres dans les mots
- 22. JavaScript et pourquoi les majuscules fonctionnent parfois et parfois non
- 23. Les tags doivent-ils utiliser une virgule ou un espace?
- 24. Je cherche un conseil pour résoudre les problèmes qui se produisent uniquement sur votre machine
- 25. Je cherche un algorithme pour tracer une zone et puis tracer méthodiquement sur la zone
- 26. Est-il encore nécessaire de mettre un espace avant de fermer un élément vide en XHTML?
- 27. meilleure façon de convertir des lettres de base 10
- 28. Obtenir tous les tweets en majuscules
- 29. Je cherche un moyen de rechercher les valeurs dans une hashtable .net en utilisant des caractères génériques
- 30. Modrewrite autoriser les nombres, les lettres et les traits de soulignement
re.sub (r "(\ w) ([AZ])", r "\ 1 \ 2", "SorryIThinkYouMissedASpot") – tzot
Comme petite amélioration, [[: upper:]] devrait être utilisé à la place de [AZ]. – Tomalak
@Tomalak, '[[: upper:]]' n'est pas supporté par Python. C'est une [expression de support POSIX] (http://www.regular-expressions.info/posixbrackets.html). –