Python - 尝试捕获一行,正则表达式或拆分

时间:2013-05-10 21:23:11

标签: python regex split

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

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

以下是一些示例行:

[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

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

感谢。

5 个答案:

答案 0 :(得分:3)

for line in lines:
   print line.split("]")[2].split(" ")[0]

答案 1 :(得分: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']
  • \[字面意思为[
  • (.*?)是一个非贪婪的捕获组。它“扩展”以捕获文本。
  • \]字面意思为]
  • (是捕获组的开始。
  • [^\[]只匹配[
  • 之外的任何内容
  • +重复最后一次模式。
  • )关闭了捕获组。

答案 2 :(得分:1)

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

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

这比简单的split解决方案更有优势,它可以处理可以在值中包含空格的字段,在具有不同顺序的行上(即使它们具有[email] as等等。

概括它:

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字段。)

答案 3 :(得分: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)

答案 4 :(得分: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  

>>>