Регулярное выражение для соответствия точке

94

Было интересно , что лучший способ заключается в соответствии "test.this"с "blah blah blah test.this@gmail.com blah blah"есть? Используя Python.

я пытался re.split(r"\b\w.\w@")

Георгий
источник
\wсоответствует только одному символу - вы, вероятно, захотите\w+
Peter Boughton

Ответы:

161

A .в регулярном выражении - это метасимвол, он используется для соответствия любому символу. Чтобы соответствовать буквальной точке, вам нужно убрать ее, поэтому\.

Юши
источник
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 из Jenkinsfile и пытаясь исключить точечные каталоги, Jenkins не понимает escape-последовательности. Класс персонажа работал прекрасно.
Джонатан Ландрам
13

«В режиме по умолчанию точка (.) Соответствует любому символу, кроме новой строки. Если был указан флаг DOTALL, он соответствует любому символу, включая новую строку». (Документ Python)

Итак, если вы хотите оценить точку буквально, я думаю, вам следует заключить ее в квадратные скобки:

>>> p = re.compile(r'\b(\w+[.]\w+)')
>>> resp = p.search("blah blah blah test.this@gmail.com blah blah")
>>> resp.group()
'test.this'
StackUser
источник
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 . Если хотите, вы также можете посмотреть по этой ссылке , как это будет соответствовать некоторым образцам входных данных.


Эмма
источник