web-dev-qa-db-fra.com

Python correspond à une chaîne avec regex

J'ai besoin d'une expression régulière python) pour vérifier si un mot est présent dans une chaîne. La chaîne est potentiellement séparée par des virgules.

Donc par exemple

line = 'This,is,a,sample,string'

Je veux rechercher sur "échantillon", cela retournerait vrai. Je suis de merde avec les reg ex, alors quand j'ai regardé le python docs, j'ai vu quelque chose comme:

import re
re.match(r'sample', line)

Mais je ne sais pas pourquoi il y avait un 'r' avant que le texte soit apparié. Est-ce que quelqu'un peut m'aider avec l'expression régulière?

32
Zack

Êtes-vous sûr d'avoir besoin d'une regex? Il semble que vous ayez seulement besoin de savoir si un mot est présent dans une chaîne, vous pouvez donc faire:

>>> line = 'This,is,a,sample,string'
>>> "sample" in line
 True
55
jabaldonedo

Le r transforme la chaîne en chaîne brute , qui ne traite pas les caractères d'échappement (toutefois, comme il n'y en a pas dans la chaîne, elle n'est en fait pas nécessaire ici).

Également, re.match correspond au début de la chaîne. En d'autres termes, il recherche une correspondance exacte entre la chaîne et le motif. Pour faire correspondre des éléments pouvant figurer n'importe où dans la chaîne, utilisez re.search. Voir une démonstration ci-dessous:

>>> import re
>>> line = 'This,is,a,sample,string'
>>> re.match("sample", line)
>>> re.search("sample", line)
<_sre.SRE_Match object at 0x021D32C0>
>>>
23
iCodez

r représente une chaîne brute, ainsi des choses comme\seront automatiquement échappées par Python.

Normalement, si vous voulez que votre modèle inclue quelque chose comme une barre oblique inversée, vous devez lui échapper avec une autre barre oblique inversée. Les chaînes brutes éliminent ce problème.

courte explication

Dans votre cas, cela n'a pas beaucoup d'importance mais c'est une bonne habitude de commencer tôt, sinon quelque chose comme\b vous mordra dans le dos si vous ne faites pas attention (sera interprété comme un caractère de retour arrière au lieu de la limite de Word)

En ce qui concerne re.match vs re.search, voici un exemple qui clarifiera ceci pour vous:

>>> import re
>>> testString = 'hello world'
>>> re.match('hello', testString)
<_sre.SRE_Match object at 0x015920C8>
>>> re.search('hello', testString)
<_sre.SRE_Match object at 0x02405560>
>>> re.match('world', testString)
>>> re.search('world', testString)
<_sre.SRE_Match object at 0x015920C8>

Donc, la recherche trouvera une correspondance n'importe où, la correspondance ne commencera qu'au début

7
mlnyc

Vous n'avez pas besoin d'expressions régulières pour vérifier si une sous-chaîne existe dans une chaîne.

line = 'This,is,a,sample,string'
result = bool('sample' in line) # returns True

Si vous voulez savoir si une chaîne contient un motif, vous devez utiliser re.search

line = 'This,is,a,sample,string'
result = re.search(r'sample', line) # finds 'sample'

Ceci est mieux utilisé avec un filtrage par motif, par exemple:

line = 'my name is bob'
result = re.search(r'my name is (\S+)', line) # finds 'bob'
4
Inbar Rose

Comme tout le monde l'a mentionné, il est préférable d'utiliser l'opérateur "in", il peut également agir sur les listes:

line = "This,is,a,sample,string"
lst = ['This', 'sample']
for i in lst:
     i in line

>> True
>> True
2
Peter Party Bus