2016-05-02 1 views
0

Je voudrais supprimer toutes les ponctuations (sauf le point) du début et de la fin d'une chaîne, mais pas au milieu.Bicler la ponctuation avec l'expression régulière - python

Par exemple pour une chaîne d'origine:

@#%%.Hol$a.A.$% 

Je voudrais obtenir le mot .Hol$a.A. retiré de la fin et au début, mais pas à partir du milieu du mot.

Un autre exemple pourrait être la chaîne:

@#%%...&Hol$a.A....$% 

Dans ce cas, la chaîne retournée doit être ..&Hol$a.A.... parce que nous ne nous soucions pas si les caractères autorisés sont répétés.

L'idée est d'enlever toutes les ponctuations (sauf le point) juste au début et à la fin du mot. Un mot est défini comme \w et/ou un .

Un exemple pratique est la chaîne 'Barnes&Nobles'. Pour l'analyse de texte est important de reconnaître Barnes&Nobles comme une seule entité, mais sans le '

Comment atteindre l'objectif en utilisant Regex?

+0

double possible de [Supprimer tous les caractères spéciaux, la ponctuation et les espaces de chaîne] (http://stackoverflow.com/questions/5843518/remove-all-special-characters-punctuation-and -spaces-from-string) –

+0

@LaxmikantGurnalkar: Ce n'est pas un doublon. – AKS

+2

@ user2288043: Pourriez-vous poster d'autres exemples? Un seul n'est pas très utile pour couvrir d'autres cas possibles. – AKS

Répondre

2

Utilisez cette regex simple et facilement adaptable:

[\w.].*[\w.] 

Il correspondra exactement le résultat souhaité, rien de plus.

  • [\w.] correspond à tout caractère alphanumérique et le point
  • .* correspond à tout caractère (sauf newline normalement)
  • [\w.] correspond à tout caractère alphanumérique et le point

Pour modifier les délimiteurs, simplement changer l'ensemble des caractères autorisés à l'intérieur des parenthèses [].

Check this regex out on regex101.com

import re 
data = '@#%%.Hol$a.A.$%' 
pattern = r'[\w.].*[\w.]' 
print(re.search(pattern, data).group(0)) 
# Output: .Hol$a.A. 
+0

Ceci est un générique étant donné que l'utilisateur n'a pas fourni beaucoup de détails ou d'autres exemples. – AKS

+0

Cela fonctionne comme un charme .... Le nombre de points n'était pas important ... Un autre exemple pourrait être string @ # %% .... Hol $ aA ... $% dans ce cas la valeur retournée devrait être. ... Hol $ aA ... – user2288043

+0

@ user2288043 Si cette réponse a résolu votre problème, veuillez l'accepter en cliquant sur le bouton à gauche. –

1

Selon ce que vous entendez par rayant la ponctuation, vous pouvez adapter le code suivant:

import re 
res = re.search(r"^[^.]*(.[^.]*.([^.]*.)*?)[^.]*$", "@#%%.Hol$a.A.$%") 
mystr = res.group(1) 

Cela bande tout avant et après le point dans l'expression. Attention, vous devrez vérifier si le résultat est différent de None, si la chaîne ne correspond pas.

+0

Cela ne fonctionne que si la chaîne de résultat est délimitée par des points, non? Il y a une expression plus générale (et plus simple) pour ce travail. –

+0

S'il y a un alphabet juste avant le point, cela ne fonctionnerait pas: '@ # %% a.Hol $ a.A. $%'. – AKS

+0

Oui, mais la question manquait de détails. J'ai supposé qu'il voulait dépouiller n'importe quoi avant le premier point et après le dernier. Si vous voulez supprimer exclusivement certains caractères, regex n'est pas la solution. – Richard