Було цікаво , що кращий спосіб полягає у відповідності "test.this"з "blah blah blah test.this@gmail.com blah blah"є? Використання Python.
Я пробував re.split(r"\b\w.\w@")
Було цікаво , що кращий спосіб полягає у відповідності "test.this"з "blah blah blah test.this@gmail.com blah blah"є? Використання Python.
Я пробував re.split(r"\b\w.\w@")
Відповіді:
У вашому регулярному виразі вам потрібно уникнути крапки "\."або використовувати її всередині класу символів "[.]" , оскільки це метасимвол у регулярному виразі, який відповідає будь-якому символу.
Крім того, вам потрібно \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']
"У режимі за замовчуванням Крапка (.) Відповідає будь-якому символу, крім нового рядка. Якщо вказано прапор 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'
щоб уникнути нелітерально-цифрових символів рядкових змінних, включаючи крапки, ви можете використовувати re.escape:
import re
expression = 'whatever.v1.dfc'
escaped_expression = re.escape(expression)
print(escaped_expression)
вихід:
whatever\.v1\.dfc
ви можете використати вимкнений вираз, щоб знайти / зрівняти рядок буквально.
Цей вираз,
(?<=\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 . Якщо ви хочете, ви також можете подивитися за цим посиланням , як це буде відповідати деяким зразкам входів.
\wвідповідає лише одному персонажу - ви, мабуть, хочете\w+