正则表达式正则表达式中的问题元组

时间:2019-03-31 04:01:17

标签: python-3.x

所以我有一些要在其上使用正则表达式的代码。

具体来说,我需要使用re.findall()和单个正则表达式从“字符串”中提取三个名称和电子邮件地址。要这样创建3个元组的列表:[('Mary Boe','md90@uw.com'),('Cheri Moe Drake','cmd39@gmail.gbl'),('RL Fitzgeri','fit。 rl@hotmail.ing')]

这是字符串。...

string = """Name: Mary Boe, Email: md90@uw.com\n
Name: Cheri Moe Drake, Email: cmd39@gmail.gbl\n
Name: R.L. Fitzgeri, Email: fit.rl@hotmail.ing"""

到目前为止,我已经使用以下内容来获得['R.L. Fitzgeri']

re.findall('\S\S\w\S\s\w\S\w\w\w\w\S\w',string)

我已经能够获得fit.rl@hotmail.ing 与

re.findall('\w\\w\\w\\S\w\w\S\w\w\w\w\S\w\w\S\w\w\w',string)

我已经能够和Cheri Moe Drake在一起

re.findall('\w\w\w\w\w\s\w\w\w\s\w\w\w\w\w',string)

但是我一直在努力地凝结这一点,其次,正如我所说的那样,努力地使它全部出来,就像:

[('Mary Boe', 'md90@uw.com'), ('Cheri Moe Drake', 'cmd39@gmail.gbl'), ('R.L. Fitzgeri', 'fit.rl@hotmail.ing')]

2 个答案:

答案 0 :(得分:2)

这是完成任务的一种方法:

import re
string =  """Name: Jane Doe, Email: jd12@uw.com\n
Name: Sally Sue Draper, Email: ssd59@gmail.edu\n
Name: J.D. Salinger, Email: sal.jd@hotmail.org"""

pattern = r'Name: (.+?), Email: (.+)'
result = re.findall(pattern, string)
print(result)

输出:

[('Jane Doe', 'jd12@uw.com'), ('Sally Sue Draper', 'ssd59@gmail.edu'), ('J.D. Salinger', 'sal.jd@hotmail.org')]

正则表达式说明

Name:           # literally
(.+?)           # group 1, 1 or more any character but newline, not greedy
, Email:        # literally
(.+)            # group 2, 1 or more any character but newline

答案 1 :(得分:0)

如果您始终使用相同的格式,则在这种情况下避免使用正则表达式并替代解决问题可能更有意义:

string = """Name: Jane Doe, Email: jd12@uw.com\n
Name: Sally Sue Draper, Email: ssd59@gmail.edu\n
Name: J.D. Salinger, Email: sal.jd@hotmail.org"""

people = [person for person in string.split('\n') if person]

people_list = []
for person in people:
    name = ''
    for char in person[6:]:
        if char == ',':
            break
        else:
            name += char

    email = ''
    for char in person[::-1]:
        if char == ' ':
            break
        else:
            email += char
    email = email[::-1]

    person_tuple = (name, email)
    people_list.append(person_tuple)

如果打印people_list,这将为您提供元组列表:

[('Jane Doe', 'jd12@uw.com'), ('Sally Sue Draper', 'ssd59@gmail.edu'), ('J.D. Salinger', 'sal.jd@hotmail.org')]

这假设您的所有行都以Name:开头,这就是循环通过将其后的所有字符连接到找到的第一个逗号来建立名称的原因。

对于电子邮件,它做相反的事情:从字符串的末尾开始直到找到一个空格(电子邮件实际上是在此结束)为止,它占用所有字符。然后将其放回去,以获取正确的电子邮件。

要构建联系人列表,循环会将nameemail格式化为元组,然后将其附加到people_list上,直到没有其他联系人可以添加为止。

如果您坚持使用正则表达式,那么如果您希望验证电子邮件地址,并且如果电子邮件与您选择的格式不符(或保留它的格式)则不希望将联系人添加到列表中,则可能是一个很好的选择改为空白)。正则表达式模式如下所示:

email = 'example@email.com'
pattern = r'[a-z]+[a-z0-9]*[\w._-]*@[a-z]+\.[a-z]{1,3}$'
if re.match(pattern, email):
    # do something with email here

请注意,在这种情况下,正则表达式使用+*之类的符号来避免重复,这是构建更强大的正则表达式的关键之一。

相关问题