我有一个包含一些姓名,电子邮件和其他内容的文本文件。我想捕获电子邮件地址。
我不知道这是分裂还是正则表达式问题。
以下是一些示例行:
[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
我希望能够创建一个打印所有电子邮件地址的循环。
感谢。
答案 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
>>>