J'essaie de trouver certains mots-clés dans une chaîne avec python. La chaîne est quelque chose comme ceci:python regexp pour quelques milliers de mots
A was changed from B to C
tous J'essaie de trouver est le « à C » partie, où C est l'un des plusieurs milliers de mots.
Ce code construit la chaîne de regexp:
pre_pad = 'to '
regex_string = None
for i in words:
if regex_string == None:
regex_string = '\\b%s%s(?!-)(?!_)\\b' %(pre_pad, i)
else:
regex_string = regex_string + '|\\b%s%s(?!-)(?!_)\\b' %(pre_pad, i)
Et plus tard, je le veux
matches = []
for match in re.finditer(r"%s" %regex_string, text):
matches.append([match, MATCH_TYPE])
Ce code fonctionne sur linux, mais se bloque sur macos avec « Pris OverflowError tout en rendant: régulier dépassement de la limite de taille du code d'expression "
Je réalise que le regex_string est très longue et que c'est la cause du problème
print regex_string.__len__()
63574
comment puis-je résoudre ce problème si ce sera toujours travailler, indépendamment du nombre de mots?
EDIT:
j'oublié de mentionner que le pre_pad est parfois vide: pre_pad = '', donc la recherche de pre_pad premier n'est pas toujours possible. En plus de cela, la raison pour laquelle je construis tout le regex_string d'abord et ensuite le faire correspondre avec les mots est que je dois faire ce correspondant pour plusieurs milliers d'entrées. Si je devais reconstruire la regex_string à chaque fois, cela conduirait à de très mauvaises performances.
Oh, et j'ai besoin de savoir quel mot correspond.
Cela n'aurait jamais dû vous arriver de le faire avec une regex, ce que vous décrivez n'est même pas à distance comme le sont les regex. Il suffit de diviser la chaîne sur les espaces et de parcourir les mots en vérifiant un 'set' ou un' dict' des mots-clés désirés. –
cela ne sera-t-il pas plus lent? – memyself
Pourquoi serait-il plus lent? Par définition, les recherches set et dict sont extrêmement rapides (et doivent l'être, pratiquement tout ce que vous faites en Python dépend d'une dict), et je divise une chaîne de 28Mo en une liste de 4 millions d'éléments en environ 1 seconde. A quel point tes cordes sont-elles gémineuses? L'optimisation prématurée n'achève rien mais gaspille du temps de développement précieux, et finit généralement par vous donner du code sous-optimal de toute façon. –