J'essaye de diviser une chaîne qui peut ressembler à ceci:
Right (Out) (of the Gate at 12PM)
En:
Un imbécile (7000) (et son argent sont et S00n) séparés en utilisant Python
Le ) sera toujours présent à la fin de la chaîne et sera toujours précédé d'un mot / nombre.
Je pensais que le diviser par la droite en utilisant un motif [mot / nombre]) fonctionnerait.
Modifier:
Comme demandé, voici quelques exemples supplémentaires
Right (Out of the) Gate
Résultat attendu: Right (Out of the) Gate p >
A Fool (SEVEN000) (and His Money are S00n) Parted
Sortie attendue: Droite (sortie de la porte à 12PM)
5 Réponses :
Utilisez l'expression régulière suivante et la sous-chaîne à l'index:
\b[A-Za-z0-9]+\) [A-Za-z0-9]+$
(cela suppose qu'après le crochet fermant il n'y a qu'un seul mot, vous devrez donner plus d'informations donc je peut mettre à jour la réponse si ce n'est pas vrai)
Voici une option utilisant re.split avec une anticipation positive. Le modèle que j'utilise est:
input = "A Fool (SEVEN000) (and His Money are S00n) Parted" parts = re.split(r'\s+(?=\w+\)(?:\s|$))', input) print(parts) ['A Fool (SEVEN000) (and His Money are', 'S00n) Parted']
Ce modèle dit de diviser et de consommer n'importe quelle quantité d'espace blanc, lorsque ce qui suit est un ou plusieurs caractères de mot qui sont eux-mêmes suivis d'une parenthèse fermante et d'un espace blanc ou fin de l'entrée.
\s+(?=\w+\)(?:\s|$))
Cela semble être une bonne solution. Cependant, il ne serait pas divisé si le mot «Parted» n'existait pas. J'ai édité ma question pour ajouter quelques exemples supplémentaires. Appréciez votre réponse de toute façon.
@HinEge J'ai mis à jour ma réponse pour couvrir vos autres exemples.
Vous semblez séparer votre chaîne du dernier espace présent entre vos parenthèses. Vous pouvez utiliser cette expression régulière,
['A Fool (SEVEN000) (and His Money are', 'S00n) Parted']
Vérifiez ce code Python,
import re s = 'A Fool (SEVEN000) (and His Money are S00n) Parted' arr = re.split(r' (?=[^()]*\))(?=\S*\))', s) print(arr)
Imprime comme vous le souhaitez,
(?=[^()]*\))(?=\S*\))
Pourquoi le faire de cette façon? Cela rend vraiment la lisibilité difficile. Pourquoi pas re.split (r '(?! [()] +) (? = [\ S] *? \))', S) ?
Je le ferais de la manière suivante:
('A Fool (SEVEN000) (and His Money are', 'S00n) Parted')
La sortie suit 2-tuple:
import re text = 'A Fool (SEVEN000) (and His Money are S00n) Parted' parted = re.findall(r'(.+)\s+(\S+\)[^\)]*$)',text)[0] print(parted)
Pour comprendre mon expression régulière, il pourrait être divisé en:
1er groupe: .+
séparateur: \s+
2ème groupe : \S+\)[^\) *$
Le premier groupe correspond à au moins 1 caractères qui ne sont pas une nouvelle ligne \ n code>, le séparateur correspond à au moins 1 caractère d'espacement (cela signifie non seulement un espace, mais aussi un retour chariot \ r , tab \ t et ainsi on), enfin mais surtout le deuxième groupe se compose d'au moins un caractère non blanc suivi de ) suivi de 0 ou plus non- ) (c'est-à-dire tout caractère qui n'est pas ) ) qui s'étend jusqu'à la fin de la chaîne comme indiqué par $ .
Si vous voulez uniquement des espaces à la place des caractères blancs, remplacez \ s par (espace) et \ S par [^] code >
Si le séparateur n'est qu'un espace blanc, nous pouvons le faire sans regex. Cela peut être comme ça, en utilisant rfind():
def splitter(a_string):
idx1 = a_string.rfind(')')
idx2 = a_string.rfind(' ', 0, idx1)
idx3 = a_string.rfind('(', 0, idx1)
if (idx2 > -1) and (idx3 < idx2):
return (a_string[:idx2], a_string[idx2:])
else:
return None
input: splitter ('Right (Out) (of the Gate at 12PM)')
sortie: ('Right (Out) (of the Gate at', '12PM)')
input: splitter ('Right (Out)')
résultat: Aucun
Je ne comprends pas tout à fait le motif que vous souhaitez associer. Pourriez-vous élaborer et donner d'autres exemples?
Voulez-vous diviser votre chaîne avec le dernier espace entre vos parenthèses? Avez-vous également une autre justification pour diviser votre chaîne? Pouvez-vous également ajouter d'autres échantillons et la sortie attendue?