Замена определенного символа на шаблон ниже, используя RegEx в Python

1

У меня есть строки, как показано ниже:

s1 = "My email Id is abcd@g mail.com"
s2 = "john@ hey.com is my email id"
s3 = "id is rock@gmail .com"
s4 = "The id is sam @yahoo.in"

Я должен заменить пустое место в идентификаторе электронной почты, используя регулярное выражение. Как я могу это достичь?

Я старался

s = re.sub(r'@\w*[\s]+[\w]*\.', r'', s1)

который дает мне результат как:

'My email Id is abccom'

Выход должен быть:

'My email Id is [email protected]' 

Я не уверен, как заменить только пустое значение на re.sub.

Любые предложения приветствуются

Спасибо,

Теги:
python-3.x

2 ответа

2
Лучший ответ

Вы можете использовать вызываемый для удаления пробелов после сопоставления адресов электронной почты с пробелами с использованием re.sub.

import re
l = [
    "My email Id is abcd@g mail.com",
    "john@ hey.com is my email id",
    "id is rock@gmail .com",
    "The id is sam @yahoo.in"
]
for s in l:
    print(re.sub(r'[\w.-]+ ?@(?:[\w-]+\.[\w -]+|[\w -]+\.[\w-]+)', lambda e: e[0].replace(' ', ''), s))

Эти результаты:

My email Id is [email protected]
[email protected] is my email id
id is [email protected]
The id is [email protected]
  • 0
    Я сделал небольшое изменение в вопросе. Он отлично работает, если идентификатор электронной почты в конце, но он удаляет пробелы между другими словами, если идентификатор электронной почты не в конце. Смотрите вторую строку вопроса.
  • 0
    Понимаю. Отредактировал мой ответ соответственно тогда.
1

Вы можете использовать обратные ссылки в re.sub (онлайн-regex здесь):

import re

data = [
"My email Id is abcd@g mail.com",
"Email Id: defg@yah oo.com",
"id is rock@gmail .com"
]

for s in data:
    print(re.sub(r'(@.*)(\s+)(.*)', r'\1\3', s))

Печать:

My email Id is [email protected]
Email Id: [email protected]
id is [email protected]

РЕДАКТИРОВАТЬ:

Если пустое пространство перед @, регулярное выражение несколько сложнее (чтобы не соответствовать, например, "aaa bbb ccc [email protected]", онлайн-регулярное выражение здесь):

import re

data = [
"My email Id is ab [email protected]",
"Email Id: def [email protected]",
"id is roc [email protected]",
"aaa bbb ccc [email protected]"
]

for s in data:
    print(re.sub(r'(?=is|:)(.*)\s+(.*@.*)', r'\1\2', s))

Печать:

My email Id is [email protected]
Email Id: [email protected]
id is [email protected]
aaa bbb ccc [email protected]

Теперь мы можем объединить эти регулярные выражения:

import re

data = [
"My email Id is ab [email protected]",
"Email Id: def g@ya hoo.com",
"id is roc k@gm ail.com",
"aaa bbb ccc [email protected]"
]

for s in data:
    s = re.sub(r'(@.*)\s+(.*)', r'\1\2', s)
    s = re.sub(r'(?=is|:)(.*)\s+(.*@.*)', r'\1\2', s)
    print(s)

Будет печать:

My email Id is [email protected]
Email Id: [email protected]
id is [email protected]
aaa bbb ccc [email protected]
  • 0
    Я отредактировал свой вопрос с еще одним условием, если пробел перед @
  • 0
    @AkshayNevrekar Я обновил свой ответ
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню