python - 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 ;
这不是最优的,因为我得到了很多我无法解析的空间。此外,我觉得这不是最佳方法。感谢任何建议。
谢谢
解决方案
使用 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*
匹配可选的空白字符<[^<>@]+@[^<>@]+>
匹配标签之间的单个@
例如
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']
推荐阅读
- html - 如何进入内部 Maybe monad 从纯脚本中的 html 按钮中提取类名?
- html - 自动调整 div 边距顶部动态
- python - 如何使用python获取thingspeak通道的field1值
- typo3-8.x - TYPO3 类型为 xxx\\yyy\\Domain\\Model\\User 的对象,身份为 \"1\" 未找到。"
- javascript - 如何处理异步/等待获取 API 中的错误 404
- android - 我找不到 android.test 命名空间
- leaflet - Leaflet.Deflate 与 Leaflet.markercluster 在悬停时不显示集群覆盖
- arrays - Matlab:计算对象数组中每个对象的函数
- magento2 - Magento 2:Ajax 调用列行操作时显示加载器?
- python - Python中使用列表的字谜