我从来没有想过我会需要正则表达式的帮助,但在这里:
我正在寻找用于解析电子邮件地址的单个正则表达式:
someone@example.com
→{"name": "", "email": "someone@example.com"}
Some One <someone@example.com>
→{"name": "Some One", "email": "someone@example.com"}
正则表达式必须生成两个组:名称和电子邮件。
这是我目前的状态:
regex = r"^((?P<name>[^(\s+\<)]*)\s+\<)?(?P<email>[^@]+?@[^>]+)>?$"
我绝对相信我需要在第一个嵌套块中转义某些东西,因为这是一个实际的结果:
{'email': 'Some One <someone@example.com', 'name': None}
*
放入正则表达式(不回答问题)答案 0 :(得分:2)
&#34;定期&#34;表达式被称为因为它们指定了所谓的&#34;常规语言&#34;。这类语言的特点是无上下文规则;例如,单词&#34; bow&#34;仅仅意味着一件事,不管它被哪些词包围(让我们说它是&#34的关键词;狗说什么&#34;)。这与上下文相关的语言不同,其中&#34; bow&#34;在&#34;我在你面前鞠躬&#34;不同于&#34;用弓射击&#34;这不同于&#34;弓哇&#34;。
现代正则表达式在某种程度上超越了这个定义,但是,RFC822中定义的From:
标头语法太复杂了,甚至连一个加强的正则表达式引擎都无法解析。您确实需要依赖于上下文的语法(实际上,RFC5322包含一个)来完全解析规范允许的每个可能的变体。要连接到前面的示例,\"
的含义(即应该如何解析)取决于您是否在双引号内,以及您是否正在查看&#34;真实姓名&#34 ;,电子邮件终点或评论(在括号中)。
现在,你可能想要退缩,并说只有一些可能的变化实际上是共同的,广泛使用;这是真的,并且有正则表达式处理几乎所有这些。
在http://code.iamcal.com/php/rfc822/tests/的测试套件上试试你的正则表达式,自己决定哪些测试失败对你来说真的很重要。也许你可以为你的真实意义找出一个好的规范&#34;。但是你的问题,就目前而言,必须以响亮的回答来解决,而不能做到这一点,并且#34;
答案 1 :(得分:0)
这里有一个答案,几秒钟(然后OP删除了它)里面有答案:
您需要双重逃避。
regex = r"^((?P<name>[^(\\s+\<)]*)\s+<)?(?P<email>[^@]+?@[^>]+)>?$"
↑ ↑
编辑:引用→逃脱
EDIT2:
这个正则表达式效果更好:
r'^\s*(?P<name>[^\s<>](?:.*?[^\s<>])?)??\s*<?(?P<email>[^<>@\s]+@[^<>@\s]+)>?$'
感谢@ tripleee