Было интересно , что лучший способ заключается в соответствии "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)
Итак, если вы хотите оценить точку буквально, я думаю, вам следует заключить ее в квадратные скобки:
>>> 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
вы можете использовать экранированное выражение, чтобы буквально найти / сопоставить строку.
В 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]
Это выражение,
(?<=\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+