除了一系列句点或省略号之外,匹配任何内容

时间:2014-10-25 23:11:28

标签: python regex

我想使用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'] 。 :(

2 个答案:

答案 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.findallre.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')]
>>>