Le espressioni regolari del modulo re supportano i confini delle parole (\ b)?


100

Durante il tentativo di imparare un po 'di più su espressioni regolari, un tutorial ha suggerito che è possibile utilizzare il \bmodo che corrisponda un limite di parola. Tuttavia, il seguente frammento nell'interprete Python non funziona come previsto:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

Avrebbe dovuto essere un oggetto match se qualcosa fosse stato trovato, ma lo è None.

L' \bespressione non è supportata in Python o la sto usando in modo sbagliato?


31
re.search(r"\btwo\b", x)
Funzionerà

5
Perché non usi stringhe "grezze"? r"\btwo\b"?
S.Lott

3
Le persone sono spesso confusi circa \b.
Cristo

Python fa, basta raw-stringa di r'\b'modo che il personaggio è sfuggito. (oppure \\bevita due volte , che è yukky)
smci

Risposte:


85

Perché non ci provi

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

Produzione:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

Ho anche dimenticato di menzionare, dovresti usare stringhe grezze nel tuo codice

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

Interessante, grazie per l'esempio funzionante. Hai qualche idea sul perché il metodo che ho scelto non funziona? I due approcci dovrebbero essere gli stessi, tranne per il fatto che nel tuo approccio stai compilando solo una volta.
DC

1
@ Darren: guarda il mio ultimo esempio che migliora solo quello che hai fatto. Ho fornito stringhe grezze per la ricerca.
pyfunc

1
ahh dopo il tuo suggerimento e quello di Bolo, era perché non stavo usando una corda grezza. Grazie!
DC

9
-1: all'indietro. Le stringhe grezze dovrebbero essere le prime. L'altro compito di costruire una riespressione con la %sostituzione di una stringa è una cattiva tangente, irrilevante per questa particolare domanda.
S.Lott

2
Cattiva risposta. Il codice funziona, ma non c'è alcuna spiegazione.
Aran-Fey

88

Questo funzionerà: re.search(r"\btwo\b", x)

Quando si scrive "\b"in Python, è un singolo carattere: "\x08". O esci dalla barra rovesciata in questo modo:

"\\b"

o scrivi una stringa grezza come questa:

r"\b"

4
Questo mi ha davvero aiutato ... stavo lottando con un'espressione regolare simile a pyspark e non riuscivo a capire perché il \ b (confine di parole) non funzionava. Grazie
jb1t

17

Solo per spiegare esplicitamente perché re.search("\btwo\b", x) non funziona, è perché \bin una stringa Python è l'abbreviazione di un carattere backspace.

print("foo\bbar")
fobar

Quindi il pattern "\btwo\b"cerca un backspace, seguito da two, seguito da un altro backspace, che la stringa in cui stai cercando ( x = 'one two three') non ha.

Per consentire a re.search(o compile) di interpretare la sequenza \bcome un confine di parola, esegui l'escape delle barre rovesciate ( "\\btwo\\b") o usa una stringa grezza per creare il tuo pattern ( r"\btwo\b").


10

Documentazione Python

https://docs.python.org/2/library/re.html#regular-expression-syntax

\ b

Corrisponde alla stringa vuota, ma solo all'inizio o alla fine di una parola. Una parola è definita come una sequenza di caratteri alfanumerici o di sottolineatura, quindi la fine di una parola è indicata da uno spazio bianco o da un carattere non alfanumerico e non di sottolineatura. Si noti che formalmente, \ b è definito come il confine tra un carattere \ w e un carattere \ W (o viceversa), o tra \ w e l'inizio / fine della stringa, quindi il set preciso di caratteri considerato alfanumerico dipende sui valori dei flag UNICODE e LOCALE. Ad esempio, r '\ bfoo \ b' corrisponde a 'foo', 'foo.', '(Foo)', 'bar foo baz' ma non a 'foobar' o 'foo3'. All'interno di un intervallo di caratteri, \ b rappresenta il carattere backspace, per compatibilità con le stringhe letterali di Python.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.