1
votes

Regex pour saisir une chaîne présente entre (virgule ou espace) et une chaîne fixe

Je veux une chaîne entre (virgule ou espace) et une chaîne.

Le code que j'utilise est

String 1 = "Select ID, Deliveryid.calc"
Result = Deliveryid
String 2 = "Select Deliveryid.calc"
Result = Select Deliveryid.calc

La sortie que j'obtiens en exécutant ceci

re.findall('[,]?[\s]*(.*?)[.]calc', string)

Maintenant, pour la deuxième chaîne, je veux juste le Deliveryid et non le trou. Fondamentalement, je veux la chaîne avant ".calc" et "espace ou virgule". Cela peut être n'importe qui ou les deux dans le cas de la virgule et des espaces

Il peut également y avoir une nouvelle ligne ou un onglet. Fondamentalement, tout type d'espace blanc avec la virgule. Les deux peuvent être présents ou n'importe qui.

FYI - Je veux toutes les chaînes correspondantes dans la chaîne. il peut y en avoir un ou plusieurs


10 commentaires

Voulez-vous dire [ .]([^ .]*)\.calc / [\s.]([^\s.]*)\.calc ( démo )? Ou simplement [\s.](\w+)\.calc ?


Le problème est de savoir avec quel espace ou virgule commencer la correspondance ou avec quoi (.*?) Peut correspondre. Veuillez clarifier ces points.


Eh bien, oui, j'ai utilisé un fichier . au lieu d'un , dans le commentaire ci-dessus. Pourtant, la question demeure.


Leur peut être une nouvelle ligne ou une tabulation également. Fondamentalement, tout type d'espace blanc avec la virgule @ WiktorStribiżew. Les deux peuvent être présents ou n'importe lequel.


Où? Veuillez modifier la question pour qu'elle soit claire. La réponse ci-dessous résout-elle le problème?


@ WiktorStribiżew Non, cela ne répond pas à mon problème car il peut y avoir plusieurs correspondances, et je veux toutes les sous-chaînes correspondantes.


Veuillez tout de même modifier pour afficher un bon exemple de chaîne d'entrée avec plusieurs occurrences et la sortie attendue pour cela.


Donc si [\s,]([^\s,]*)\.calc suffit? Voir la démo .


Merci, @ WiktorStribiżew pour la réponse.


J'ai publié une réponse ci - dessous , veuillez envisager d'accepter / de voter.


3 Réponses :


0
votes

Modifié légèrement l'expression régulière

import re
String1 = "Select ID, Deliveryid.calc"
String2 = "Select Deliveryid.calc"
m1 = re.search('[, ]([^, ]*?)[.]calc', String2)
print ('->' + m1.group(0) + '<-')
print ('->' + m1.group(1) + '<-')

Je pense que vous devriez obtenir la valeur du groupe (1).


2 commentaires

Pourquoi findall ne fonctionne pas comme j'obtiens \ t \ n en utilisant findall mais en utilisant match il donne la bonne réponse. Et comment obtenir la liste et non l'objet en utilisant match?


Et il peut y avoir plusieurs chaînes correspondantes. Alors, comment obtenir la liste pour tous.



0
votes

Vous devez utiliser des opérateurs regex gourmands. essaye ça:

^[^.]+

Il correspondra à tout ce qui se trouve avant le point Remarque: lorsque vous utilisez des opérateurs gourmands, vous correspondez à tout ce qui est avant le dernier. (Point) au lieu du premier. Selon votre chaîne, il correspond à tout avant le .calc

entrez la description de l'image ici

Si vous ne voulez qu'un mot avant (point), alors "Wiktor Stribiżew" vous a déjà aidé pour cela. Son expression fonctionne pour moi de la même manière. entrez la description de l'image ici

Bon apprentissage !!


0 commentaires

1
votes

Vous pouvez utiliser

import re
text = 'Select ID, Deliveryid.calc Select ID, Deliveryid.calc Select ID, Deliveryid.calc\nSelect Deliveryid.calc Select Deliveryid.calc'
print( re.findall(r'[\s,]([^\s,]*)\.calc', text) )
# => ['Deliveryid', 'Deliveryid', 'Deliveryid', 'Deliveryid', 'Deliveryid']

Voir la démo regex . Détails:

  • [\s,] - un espace ou une virgule
  • ([^\s,]*) - Groupe 1: zéro ou plusieurs caractères autres que les espaces et les virgules
  • \.calc - une chaîne .calc .

Voir la démo Python :

[\s,]([^\s,]*)\.calc


0 commentaires