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
3 Réponses :
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).
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.
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
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. 
Bon apprentissage !!
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
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,]*)\.calcsuffit? 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.