Python:Sostituire la stringa con prefixStringSuffix mantenere la custodia originale, ma ignorando caso durante la ricerca per il match

StackOverflow https://stackoverflow.com/questions/818691

Domanda

Quindi quello che sto cercando di fare è di sostituire la stringa "parole chiave" con "<b>keyword</b>" in una stringa più grande.

Esempio:

myString = "CIAO a tutti.Si dovrebbe superiore a quella persona per il lavoro.Hi Hi."

keyword = "ciao"

il risultato che vorrei sarebbe:

result = "<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>."

Io non posso sapere che cosa la parola chiave fino a quando l'utente digita la parola chiave e non si sa il corpus (myString) fino a quando viene eseguita la query.

Ho trovato una soluzione che funziona la maggior parte del tempo, ma ha alcuni falsi positivi, namely it would return "<b>hi<b/>gher"che non è quello che voglio.Nota anche che ho sto cercando di mantenere il caso del testo originale, e la corrispondenza dovrebbe prendere posto a prescindere dal caso.quindi, se la parola chiave è "hi" dovrebbe sostituire HI with <b>HI</b> and hi with <b>hi</b>.

Il più vicino sono venuto utilizza un leggermente derivata la versione di questo:http://code.activestate.com/recipes/576715/ ma ancora non riuscivo a capire come fare un secondo passaggio della stringa di risolvere tutti i falsi positivi di cui sopra.

O utilizzando il NLTK del WordPunctTokenizer (che semplifica alcune cose, come la punteggiatura) ma io non sono sicuro come vorrei mettere le frasi di nuovo insieme dato non ha una funzione di inversione e voglio mantenere la punteggiatura originale di myString.Essenziale, facendo una concatenazione di tutti i token di non restituire l'originale stringa.Per esempio non vorrei sostituire "7 - 7" con "7-7" quando la riclassificazione dei gettoni nel suo testo originale, se il testo originale era "7 - 7".

Spero di esserti stata abbastanza chiara.Sembra un problema semplice, ma è un risultato un po ' più difficile di quanto pensassi.

È stato utile?

Soluzione

Questo ok?

>>> import re
>>> myString = "HI there. You should higher that person for the job. Hi hi."
>>> keyword = "hi"
>>> search = re.compile(r'\b(%s)\b' % keyword, re.I)
>>> search.sub('<b>\\1</b>', myString)
'<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>.'

La chiave di tutta la faccenda è che utilizza i confini di parola, gruppi e il re.I flag.

Altri suggerimenti

Dovresti essere in grado di farlo molto facilmente con re.sub usando l'asserzione di confine di parola \b, che corrisponde solo a un confine di parola:

import re

def SurroundWith(text, keyword, before, after):
  regex = re.compile(r'\b%s\b' % keyword, re.IGNORECASE)
  return regex.sub(r'%s\0%s' % (before, after), text)

Quindi ottieni:

>>> SurroundWith('HI there. You should hire that person for the job. '
...              'Hi hi.', 'hi', '<b>', '</b>')
'<b>HI</b> there. You should hire that person for the job. <b>Hi</b> <b>hi</b>.'

Se hai criteri più complicati per ciò che costituisce un " limite di parola, " dovrai fare qualcosa del tipo:

def SurroundWith2(text, keyword, before, after):
  regex = re.compile(r'([^a-zA-Z0-9])(%s)([^a-zA-Z0-9])' % keyword,
                     re.IGNORECASE)
  return regex.sub(r'\1%s\2%s\3' % (before, after), text)

Puoi modificare i [^a-zA-Z0-9] gruppi in modo che corrispondano a qualsiasi cosa tu consideri un " non-word. "

Penso che la soluzione migliore sarebbe un'espressione regolare ...

import re
def reg(keyword, myString) :
   regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
   return regx.sub(r'<b>\1</b>', myString)

ovviamente, devi prima rendere la tua parola chiave " espressione regolare sicura " (cita qualsiasi carattere speciale regex).

Ecco un suggerimento, dal comitato di nitpicking. : -)

myString = "HI there. You should higher that person for the job. Hi hi."

myString.replace('higher','hire')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top