Ekspresi reguler untuk mencocokkan titik

94

Bertanya-tanya apa cara terbaik adalah untuk mencocokkan "test.this"dari "blah blah blah [email protected] blah blah"is? Menggunakan Python.

Saya sudah mencoba re.split(r"\b\w.\w@")

Georgy
sumber
\whanya cocok dengan satu karakter - Anda mungkin ingin\w+
Peter Boughton
2
Berikut regex validasi email jika Anda mencarinya.
chucksmash

Jawaban:

162

A .di regex adalah karakter meta, digunakan untuk mencocokkan karakter apa pun. Untuk mencocokkan titik literal, Anda harus menghindarinya, jadi\.

Yuushi
sumber
44

Di regex Anda, Anda harus keluar dari titik "\."atau menggunakannya di dalam kelas karakter "[.]" , karena ini adalah karakter meta dalam ekspresi reguler, yang cocok dengan karakter apa pun.

Juga, Anda perlu \w+bukan \wuntuk mencocokkan satu atau lebih karakter kata.


Sekarang, jika Anda menginginkan test.thiskonten, maka splitbukan itu yang Anda butuhkan. splitakan memisahkan string Anda di sekitar test.this. Sebagai contoh:

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

Anda dapat menggunakan re.findall:

>>> re.findall(r'\w+[.]\w+(?=@)', s)   # look ahead
['test.this']
>>> re.findall(r'(\w+[.]\w+)@', s)     # capture group
['test.this']
Rohit Jain
sumber
2
1 untuk kelas karakter. Menggunakan gcovr dari Jenkinsfile dan mencoba mengecualikan direktori titik, dan Jenkins tidak memahami escape sequence. Kelas karakter bekerja dengan baik.
Jonathan Landrum
13

"Dalam mode default, Titik (.) Cocok dengan karakter apa pun kecuali baris baru. Jika bendera DOTALL telah ditentukan, ini cocok dengan semua karakter termasuk baris baru." (Dok python)

Jadi, jika Anda ingin mengevaluasi titik literaly, saya rasa Anda harus memasukkannya ke dalam tanda kurung siku:

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

untuk keluar dari karakter non-alfanumerik dari variabel string, termasuk titik, Anda dapat menggunakan re.escape:

import re

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

keluaran:

whatever\.v1\.dfc

Anda dapat menggunakan ekspresi lolos untuk menemukan / mencocokkan string secara harfiah.

Ali Abul Hawa
sumber
-1

Dalam javascript Anda harus menggunakan \. untuk mencocokkan titik.

Contoh

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

dan

"blah.test.zibri.org".match('test\\..*')
["test.zibri.org", index: 5, input: "blah.test.zibri.org", groups: undefined]
Zibri
sumber
itu meminta python bukan JS
pl-jay
-2

Ekspresi ini,

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

mungkin juga berfungsi dengan baik untuk jenis string input tertentu.

Demo

Uji

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)

Keluaran

['test.this']

Jika Anda ingin menyederhanakan / memodifikasi / menjelajahi ekspresi, itu telah dijelaskan di panel kanan atas regex101.com . Jika mau, Anda juga dapat melihat di tautan ini , bagaimana kecocokannya dengan beberapa masukan sampel.


Emma
sumber