Беззастенчиво опираясь на усилия MrTopf:
import re
rx = re.compile("((?:@\w+ +)+)(.*)")
t='@abc @def @xyz Hello this part is text and my email is [email protected]'
a,s = rx.match(t).groups()
l = re.split('[@ ]+',a)[1:-1]
print l
print s
печатает:
['abc', 'def', 'xyz']
Здравствуйте, это текст, и мой адрес электронной почты: [email protected]
Справедливо призванный к ответу hasen j, позвольте мне пояснить, как это работает:
/@\w+ +/
соответствует одному тегу - @, за которым следует хотя бы один буквенно-цифровой символ, или _, за которым следует хотя бы один символ пробела. + является жадным, поэтому, если есть более одного пробела, он захватит их все.
Чтобы сопоставить любое количество этих тегов, нам нужно добавить плюс (один или несколько элементов) к шаблону для тега; поэтому нам нужно сгруппировать его со скобками:
/(@\w+ +)+/
который соответствует одному или нескольким тегам и, будучи жадным, соответствует всем им. Однако эти скобки теперь возятся с нашими группами захвата, поэтому мы отменяем это, превращая их в анонимную группу:
/(?:@\w+ +)+/
Наконец, мы превращаем это в группу захвата и добавляем еще одну, чтобы убрать все остальное:
/((?:@\w+ +)+)(.*)/
Последняя разбивка, чтобы подвести итог:
((?:@\w+ +)+)(.*)
(?:@\w+ +)+
( @\w+ +)
@\w+ +
Обратите внимание, что при просмотре я улучшил его — \w не нужно было в наборе, и теперь он позволяет использовать несколько пробелов между тегами. Спасибо, hasen-j!
person
Brent.Longborough
schedule
17.02.2009