首页 > 解决方案 > RegEx - 从字符串中解析姓名和姓氏

问题描述


我正在尝试从 Outlook“to”约定中的字符串解析名称和姓氏的所有实例,并将每个实例保存在 python 列表中。我正在使用 Python 3.6.4。
例如,我想要以下字符串:

“致:约翰·列侬 <John.Lennon@gmail.com> \b002; Paul McCartney <Paul.McCartney@yahoo.com> \b002;”

被解析成:

['约翰列侬','保罗麦卡特尼']

我使用将单词列表中的所有单词替换为python中的另一个字符串作为参考,并提出了以下代码:

import re
prohibitedWords = [r'to:',r'To:','\b002',"\<(.*?)\>"]
mystring = 'To: John Lennon <John.Lennon@gmail.com> \b002; Paul McCartney <Paul.McCartney@yahoo.com> \b002;'
big_regex = re.compile('|'.join(prohibitedWords))
the_message = big_regex.sub("", str(mystring)).strip()
print(the_message)

但是,我得到以下结果:

John Lennon  ; Paul McCartney  ;

这不是最优的,因为我得到了很多我无法解析的空间。此外,我觉得这不是最佳方法。感谢任何建议。
谢谢

标签: pythonregexstring

解决方案


使用 re.sub 并使用这些部分创建替代,[r'to:',r'To:','\b002',"\<(.*?)\>"] 您将用空字符串替换匹配项。

如果您要删除的所有字符都消失了,那么您最终将得到一个字符串John Lennon Paul McCartney ,如此Python 示例中所示,如果您想拆分,您不知道哪个部分属于哪里。

此外,删除周围的空白字符可能会在删除它们时导致意外的间隙或连接结果。

您可以通过匹配可能的前导部分来使匹配更加具体,并捕获您想要的部分而不是替换。

(?:\\b[Tt]o:|\b002;)\s*(.+?)\s*<[^<>@]+@[^<>@]+>
  • (?:\\b[Tt]o:|\b002;)匹配一个To to或一个退格字符和 002
  • \s*匹配可选的空白字符
  • (.+?)在组 1 中捕获 1 个或多个字符
  • \s*匹配可选的空白字符
  • <[^<>@]+@[^<>@]+>匹配标签之间的单个@

请参阅正则表达式演示Python 演示

例如

import re

pattern = "(?:\\b[Tt]o:|\b002;)\s*(.+?)\s*<[^<>@]+@[^<>@]+>"
mystring = 'To: John Lennon <John.Lennon@gmail.com> \b002; Paul McCartney <Paul.McCartney@yahoo.com> \b002;'
print(re.findall(pattern, mystring))

输出

['John Lennon', 'Paul McCartney']

推荐阅读