Espressione regolare per abbinare un punto


94

Chiedevo che cosa il modo migliore è quello di abbinare "test.this"da "blah blah blah test.this@gmail.com blah blah"IS? Usare Python.

ho provato re.split(r"\b\w.\w@")


\wcorrisponde solo a un singolo carattere - probabilmente lo vuoi\w+
Peter Boughton

2
Ecco una regex di convalida e-mail se ne stai cercando uno.
Chucksmash

Risposte:


161

Una .regex è un metacarattere, viene utilizzata per abbinare qualsiasi carattere. Per abbinare un punto letterale, è necessario eseguirne l'escape, quindi\.


44

Nella tua regex devi sfuggire al punto "\."o usarlo all'interno di una classe di caratteri "[.]" , poiché è un meta-carattere in regex, che corrisponde a qualsiasi carattere.

Inoltre, è necessario \w+invece di \wabbinare uno o più caratteri alfanumerici.


Ora, se vuoi il test.thiscontenuto, allora splitnon è quello che ti serve. splitdividerà la tua stringa attorno al file test.this. Per esempio:

>>> re.split(r"\b\w+\.\w+@", s)
['blah blah blah ', 'gmail.com blah blah']

Puoi usare re.findall:

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']

2
+1 per la classe del personaggio. Utilizzando gcovr da un file Jenkins e tentando di escludere directory di punti, Jenkins non comprende le sequenze di escape. La classe del personaggio ha funzionato magnificamente.
Jonathan Landrum

13

"Nella modalità predefinita, il punto (.) Corrisponde a qualsiasi carattere tranne una nuova riga. Se è stato specificato il flag DOTALL, questo corrisponde a qualsiasi carattere, inclusa una nuova riga." (Python Doc)

Quindi, se vuoi valutare il punto letteralmente, penso che dovresti metterlo tra parentesi quadre:

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'

0

per eseguire l'escape dei caratteri non alfanumerici delle variabili stringa, inclusi i punti, potresti usare re.escape:

import re

expression = 'whatever.v1.dfc'
escaped_expression = re.escape(expression)
print(escaped_expression)

produzione:

whatever\.v1\.dfc

puoi usare l'espressione con escape per trovare / abbinare la stringa letteralmente.


-1

In javascript devi usare \. per abbinare un punto.

Esempio

"blah.tests.zibri.org".match('test\\..*')
null

e

"blah.test.zibri.org".match('test\\..*')
["test.zibri.org", index: 5, input: "blah.test.zibri.org", groups: undefined]

chiede Python non JS
pl-jay

-2

Questa espressione,

(?<=\s|^)[^.\s]+\.[^.\s]+(?=@)

potrebbe anche funzionare bene per quei tipi specifici di stringhe di input.

Demo

Test

import re

expression = r'(?<=^|\s)[^.\s]+\.[^.\s]+(?=@)'
string = '''
blah blah blah test.this@gmail.com blah blah
blah blah blah test.this @gmail.com blah blah
blah blah blah test.this.this@gmail.com blah blah
'''

matches = re.findall(expression, string)

print(matches)

Produzione

['test.this']

Se desideri semplificare / modificare / esplorare l'espressione, è stato spiegato nel pannello in alto a destra di regex101.com . Se lo desideri, puoi anche guardare in questo link , come corrisponderebbe ad alcuni input di esempio.


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.