2015-01-16 2 views
0

У меня есть два выражения:

1. (\w+)[\s\(]at[\s\)](\w+)\sdot\s(\w+)\sdot\sedu
2. (\w+)[\s\(]at[\s\)](\w+)\.(\w+)\.eduКомбинирования регулярных выражений для электронной почты выскабливания

Первая идентифицирует:

ЦСКА в А ц.п. точка точки Edu
csk (at) cs dot xyz dot edu

Второй определяет:

ЦСКА в cs.xyz.edu
ЦСКА (в) cs.xyz.edu

Как совместить выше два? Я также хочу, чтобы включить @ в нем, что я сделал:

(\w+)[\s\(][/at/@][\s\)](\w+)\sdot\s(\w+)\sdot\sedu

, но он не работает. Может кто-нибудь, пожалуйста, помогите? У меня много форматов для покрытия, но я не хочу писать каждое регулярное выражение явно.

+0

Я нашел опрятный сайт, чтобы попробовать regex -http: //regexpal.com/ – Coffee

ответ

0

Поместите различные шаблоны внутри группы, не связанной с захватом, разделенной | логическим оператором ИЛИ.

(\w+)[\s\(](?:at|@)[\s\)](\w+)(?:\sdot\s(\w+)\sdot\sedu|\.(\w+)\.edu) 

Добавить якорь при необходимости.

^(\w+)[\s\(](?:at|@)[\s\)](\w+)(?:\sdot\s(\w+)\sdot\s|\.(\w+)\.)edu$ 

DEMO

+0

Выход, который я получаю:
'[('csk', 'cs', 'xyz', ''), (csk, cs, xyz, , ('csk', 'cs', '', 'xyz'), ('csk', 'cs', 'xyz', '')] '. Как мне избавиться от пустых пространств? – CSK

+0

Я не могу использовать фильтр (None, array), так как элементы в списке являются кортежами. – CSK

+0

@CSK попробуйте этот '[tuple (filter (None, i)) для i в lst]' –

0

[/at/@] не соответствует тому, что вы думаете, что он делает. [...] обозначает набор символов, так что часть соответствует отдельным символам /, a, t, или @.

Для того, чтобы соответствовать либо at или @, вам нужно будет использовать:

(?:at|@) 

Вот ссылка на Питона Regular Expression Syntax.