2

我有一个包含一些姓名、电子邮件和其他内容的文本文件。我想捕获电子邮件地址。

我不知道这是拆分问题还是正则表达式问题。

以下是一些示例行:

[name]bill billy [email]bill.billy@hotmail.com [dob]01.01.81
[name]mark hilly [email]mark.hilly@hotmail.com [dob]02.11.80
[name]gill silly [email]gill.silly@hotmail.com [dob]03.12.79

我希望能够执行一个打印所有电子邮件地址的循环。

谢谢。

4

5 回答 5

3
for line in lines:
   print line.split("]")[2].split(" ")[0]
于 2013-05-10T21:29:40.670 回答
3

我会使用正则表达式:

import re

data = '''[name]bill billy [email]bill.billy@hotmail.com [dob]01.01.81
[name]mark hilly [email]mark.hilly@hotmail.com [dob]02.11.80
[name]gill silly [email]gill.silly@hotmail.com [dob]03.12.79'''

group_matcher = re.compile(r'\[(.*?)\]([^\[]+)')

for line in data.split('\n'):
    o = dict(group_matcher.findall(line))
    print o['email']
  • \[是字面意思[
  • (.*?)是一个非贪婪的捕获组。它“扩展”以捕获文本。
  • \]从字面上看]
  • (是捕获组的开始。
  • [^\[]匹配除 a 之外的任何内容[
  • +重复最后一个模式任意次数。
  • )关闭捕获组。
于 2013-05-10T21:31:36.580 回答
1

您可以将子字符串传递给split,而不仅仅是单个字符,因此:

email = line.partition('[email]')[-1].partition('[')[0].rstrip()

与简单的解决方案相比,这具有一个优势split,它适用于值中可以包含空格的字段、具有不同顺序的事物的行(即使它们[email]作为最后一个字段)等。

概括它:

def get_field(line, field):
    return line.partition('[{}]'.format(field)][-1].partition('[')[0].rstrip()

但是,我认为它仍然比正则表达式解决方案更复杂。另外,它一次只能搜索一个字段,而不是一次搜索所有字段(不会使其变得更加复杂)。要获得两个字段,您最终将解析每行两次,如下所示:

for line in data.splitlines():
    print '''{} "babysat" Dan O'Brien on {}'''.format(get_field(line, 'name'), 
                                                      get_field(line, 'dob'))

(当然,我可能误解了DOB字段。)

于 2013-05-10T21:42:25.067 回答
0

您可以按空格分割,然后搜索以 开头的元素[email]

line = '[name]bill billy [email]bill.billy@hotmail.com [dob]01.01.81'
items = line.split()
for item in items:
    if item.startswith('[email]'):
        print item.replace('[email]', '', 1)
于 2013-05-10T21:26:02.197 回答
0

假设您有一个带行的文件。

import re

f = open("logfile", "r")
data = f.read()

for line in data.split("\n"):
    match=re.search("email\](?P<id>.*)\[dob", line)
    if match:
             # either store or print the emails as you like
             print match.group('id').strip(), "\n"

就是这样(试试吧,对于上面的python 3 n,请记住 print 是一个进行这些更改的函数)!

样本数据的输出:

bill.billy@hotmail.com  

mark.hilly@hotmail.com  

gill.silly@hotmail.com  

>>> 
于 2013-05-10T21:43:46.987 回答