1
votes

Erreur: mauvaise échappement dans le script Python avec regex

J'essaie de faire une recherche entre les listes et de renvoyer la valeur quand elle correspond, et quand ce n'est pas le cas.

Match: brasil
Match: argentina
Match: chile
Not match: canada

Résultat:

Not match: brasil.sao_paulo
Not match: chile
Traceback (most recent call last):
  File "main.py", line 7, in <module>
    if re.search('\\{}\\b'.format(x), y, re.IGNORECASE):
  File "/usr/local/lib/python3.7/re.py", line 183, in search
re.error: bad escape \c at position 0


6 commentaires

Le regex qui échoue est \ chile \ b . J'imagine que ce n'est pas ce que vous vouliez rechercher.


Je voudrais qu'il recherche quel que soit l'ordre du tableau


Exemple: Array 1 -> Line1 == Array2 -> Toutes les lignes


Quel est le but du «\\» initial?


Je suis nouveau sur regex, j'essaie juste de le faire, je suggère le contraire?


Tout d'abord, vous devez utiliser re.escape pour insérer du code dans votre regex. Deuxièmement, la première barre oblique inverse n'est pas nécessaire (et provoque votre problème), troisièmement, utilisez r '' : re.escape (x) + r '\ b'


3 Réponses :


2
votes

Si vous zippez , vous n'obtiendrez que des correspondances par paires. Compte tenu de la nature de votre recherche, vous pouvez simplement joindre la botte de foin dans une chaîne délimitée par des espaces et joindre les aiguilles dans un motif avec alternance et laisser findall disparaître:

>>> import re
>>> needles = ['brasil', 'argentina', 'chile', 'canada']
>>> haystack = ['brasil.sao_paulo', 'chile', 'argentina']
>>> re.findall(r"\b%s\b" % "|".join(needles), " ".join(haystack), re.I)
['brasil', 'chile', 'argentina']

L'intention derrière \\ dans l'expression régulière d'origine n'est pas claire, donc je suppose que vous voulez \ b des deux côtés du modèle.


0 commentaires

4
votes

Si je comprends bien, vous n'avez pas besoin de regex ici.

Match: brasil
Match: argentina
Match: chile
Not match: canada

qui renvoie

group_1 = ['brasil','argentina','chile','canada']
group_2 = ['brasil.sao_paulo','chile','argentina']

for x in group_1:
    # For group 2 only, this picks out the part of the string that appears before the first ".".
  if x in [y.split('.')[0] for y in group_2]:
    print("Match: {}".format(x))
  else:
    print("Not match: {}".format(x))


0 commentaires

1
votes

Une solution simple avec la méthode any :

array = ['brasil', 'argentina', 'chile', 'canada']
array2 = ['brasil.sao_paulo', 'chile', 'argentina']

for x in array:
    if any(x.casefold() in y.casefold() for y in array2):
        print("Match:", x)
    else:
        print("Not match:", x)


0 commentaires