разделить все вхождения и сохранить разделитель - PullRequest
0 голосов
/ 24 мая 2019

Я уже прочитал это и это и это и многие другие. Они не отвечают на мою проблему.

Я бы хотел отфильтровать строку, которая может содержать электронные письма или строки, начинающиеся с "@" (например, электронные письма, но без текста перед "@"). Я протестировал многие из них, но одним из самых простых, который начинает приближаться, является:

import re
re.split(r'(@)', "test @aa test2 @bb @cc t-es @dd-@ee, test@again")
Out[40]: 
['test ', '@', 'aa test2 ', '@', 'bb ', '@', 'cc t-es ', '@', 'dd-', '@', 'ee, test', '@', 'again']

Я ищу правильное регулярное выражение, которое могло бы дать мне:

['test ', '@aa', 'test2 ', '@bb ', '@cc', 't-es ', '@dd-', '@ee', 'test@again']

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Зачем пытаться разделить, когда вы можете сказать "yo regex, дай мне все, что соответствует":

test = "test @aa test2 @bb @cc t-es @dd-@ee, test@again"


import re

print(
    re.findall("[^\s@]*?@?[^@]* |[^@]*@[^\s@]*", test)
)
# ['test ', '@aa test2 ', '@bb ', '@cc t-es ', '@dd-', '@ee, ', 'test@again']

Я пытался, но я не мог сделать регулярное выражение меньше, но, по крайней мере, это работает икто ожидает, что регулярное выражение будет маленьким в любом случае


Согласно новым требованиям ОП (или исправленным требованиям)

[^\s@]*?@?[^\s@]* |[^@]*@[^\s@]* 
0 голосов
/ 24 мая 2019

Мое собственное решение, основанное на различном разборе электронной почты + простой разбор "@[:alphanum:]+":

USERNAME_OR_EMAIL_REGEX = re.compile(
    r"@[a-zA-Z0-9-]+"  # simple username
    r"|"
    r"[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+"  # email 
    r"@"  # following: domain name:
    r"[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?"
    r"(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...