Регулярний вираз, який відповідає крапці


93

Було цікаво , що кращий спосіб полягає у відповідності "test.this"з "blah blah blah test.this@gmail.com blah blah"є? Використання Python.

Я пробував re.split(r"\b\w.\w@")


\wвідповідає лише одному персонажу - ви, мабуть, хочете\w+
Пітер Боутон

Відповіді:


158

.У регулярному виразі є метасимволом, він використовується , щоб відповідати будь-якому символу. Щоб зіставити буквальну крапку, вам потрібно її уникнути, отже\.


44

У вашому регулярному виразі вам потрібно уникнути крапки "\."або використовувати її всередині класу символів "[.]" , оскільки це метасимвол у регулярному виразі, який відповідає будь-якому символу.

Крім того, вам потрібно \w+замість того, \wщоб відповідати одному або декільком символам слова.


Тепер, якщо ви хочете test.thisвміст, splitце не те, що вам потрібно. splitрозділить ваш рядок навколо test.this. Наприклад:

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

Ви можете використовувати re.findall:

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

2
+1 для класу персонажів. Використовуючи gcovr з файлу Jenkins і намагаючись виключити крапкові каталоги, і Jenkins не розуміє послідовності екранування. Клас персонажів працював чудово.
Джонатан Ландрум,

13

"У режимі за замовчуванням Крапка (.) Відповідає будь-якому символу, крім нового рядка. Якщо вказано прапор DOTALL, це відповідає будь-якому символу, включаючи новий рядок." (python Doc)

Отже, якщо ви хочете оцінити крапку буквально, я думаю, вам слід поставити її у квадратних дужках:

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

0

щоб уникнути нелітерально-цифрових символів рядкових змінних, включаючи крапки, ви можете використовувати re.escape:

import re

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

вихід:

whatever\.v1\.dfc

ви можете використати вимкнений вираз, щоб знайти / зрівняти рядок буквально.


-1

У javascript потрібно використовувати \. відповідати крапці.

Приклад

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

і

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

він просить python не JS
pl-jay

-2

Цей вираз,

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

може також працювати нормально для тих конкретних типів вхідних рядків.

Демо

Тест

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)

Вихідні дані

['test.this']

Якщо ви хочете спростити / змінити / дослідити вираз, це було пояснено на верхній правій панелі regex101.com . Якщо ви хочете, ви також можете подивитися за цим посиланням , як це буде відповідати деяким зразкам входів.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.