我想使用Python的re.findall()
方法来匹配以下内容:
电子邮件...... @ gmail.com
以我得到
的返回值的方式["Email", "@gmail.com"]
点可以是句点或椭圆。最好是这样的混合,尽管它可能并不重要(文字处理器经常会将...
折叠为单个Unicode椭圆字符u'\u2026'
,但是如果剩下一个...... {...}}。
我一直试图通过"匹配任何不是椭圆和句点序列的东西来解决它,但它很难,因为补充只能在{{1 }}!有没有人有任何想法?
进展:
我找到了[]
,它给了我
u"([^\u2026](?!\.\.))"
不幸的是,试图在群组中匹配这些(通过在正则表达式的末尾添加加号)会给我[u'E', u'-', u'M', u'a', u'i', u'l', u' ', u'a', u'd', u'd', u'r', u'e', u's', u's', u' ', u'\t', u'@', u'g', u'm', u'a', u'i', u'l', u'.', u'c', u'o', u'm']
。 :(
答案 0 :(得分:1)
您可以尝试以下代码,
>>> import re
>>> s = "Email......@gmail.com"
>>> re.findall(r'(?:(?=[^.]|(?<=\w)\.(?=\w)).)+', s)
['Email', '@gmail.com']
这背后的想法是,上面的正则表达式会匹配任何字符,但不匹配点一次或多次。如果找到一个点,则检查前一个和后一个字符。仅当前面的和后面的char必须是单词字符时才允许使用点。
答案 1 :(得分:0)
您可以使用以下模式:
(\w+)\.{2,}(.+)
以下是它的作用细分:
( # Starts capture group 1
\w+ # Matches 1 or more word characters
) # Closes capture group 1
\.{2,} # Matches . 2 or more times
( # Starts capture group 2
.+ # Matches 1 or more characters
) # Closes capture group 2
这是一个示范:
>>> import re
>>> re.match('(\w+)\.{2,}(.+)', 'Email......@gmail.com').groups()
('Email', '@gmail.com')
>>>
您也会注意到我使用的是re.match
而不是re.findall
。 re.findall
用于在字符串中查找多个出现的模式。如果只出现一次,您应该使用re.match
(从头开始匹配)或re.search
(在任何地方匹配)。
但是,如果 多次出现,那么在模式中使用re.findall
将返回表示匹配的元组列表:
>>> import re
>>> data = '''
... Email......@gmail.com
... Name.......Bob
... Email......@yahoo.com
... Name.......Joe
... '''
>>> re.findall('(\w+)\.{2,}(.+)', data)
[('Email', '@gmail.com'), ('Name', 'Bob'), ('Email', '@yahoo.com'), ('Name', 'Joe')]
>>>