Expressão regular para corresponder a um ponto

93

Queria saber qual a melhor maneira é combinar "test.this"a partir "blah blah blah [email protected] blah blah"é? Usando Python.

eu tentei re.split(r"\b\w.\w@")

Georgiano
fonte
\wcorresponde apenas a um único caractere - provavelmente você deseja\w+
Peter Boughton
2
Aqui está um regex de validação de e-mail se você estiver procurando por um.
chucksmash

Respostas:

150

Um .em regex é um metacaractere, é usado para corresponder a qualquer caractere. Para corresponder a um ponto literal, você precisa escapar dele, então\.

Yuushi
fonte
43

Em sua regex, você precisa escapar do ponto "\."ou usá-lo dentro de uma classe de caractere "[.]" , pois é um metacaractere na regex, que corresponde a qualquer caractere.

Além disso, você precisa em \w+vez de \wcorresponder a um ou mais caracteres do word.


Agora, se você quer o test.thisconteúdo, então splitnão é o que você precisa. splitirá dividir sua corda em torno do test.this. Por exemplo:

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

Você pode usar re.findall:

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']
Rohit Jain
fonte
2
1 para classe de personagem. Usando gcovr de um Jenkinsfile e tentando excluir diretórios de ponto, o Jenkins não entende sequências de escape. A classe de personagens funcionou lindamente.
Jonathan Landrum
12

"No modo padrão, Ponto (.) Corresponde a qualquer caractere, exceto uma nova linha. Se o sinalizador DOTALL foi especificado, ele corresponde a qualquer caractere incluindo uma nova linha." (python Doc)

Então, se você quiser avaliar o ponto literalmente, acho que você deve colocá-lo entre colchetes:

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah [email protected] blah blah")
>>> resp.group()
'test.this'
StackUser
fonte
0

Em javascript você deve usar \. para combinar com um ponto.

Exemplo

"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]
Zibri
fonte
pede python, não JS
pl-Jay,
0

para escapar caracteres não alfanuméricos de variáveis ​​de string, incluindo pontos, você pode usar re.escape:

import re

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

resultado:

whatever\.v1\.dfc

você pode usar a expressão de escape para localizar / combinar a string literalmente.

Ali Abul Hawa
fonte
-1

Esta expressão,

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

também pode funcionar bem para esses tipos específicos de strings de entrada.

Demo

Teste

import re

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

matches = re.findall(expression, string)

print(matches)

Resultado

['test.this']

Se você deseja simplificar / modificar / explorar a expressão, isso foi explicado no painel superior direito de regex101.com . Se desejar, você também pode assistir neste link , como ele corresponderia a algumas entradas de amostra.


Emma
fonte