如何在嵌套括号和括号内正确转义?

时间:2015-03-25 18:47:36

标签: python regex email

我从来没有想过我会需要正则表达式的帮助,但在这里:

我正在寻找用于解析电子邮件地址的单个正则表达式:

  • 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}

编辑:忘记将*放入正则表达式(不回答问题)
EDIT2:solved。谢谢大家的帮助。
EDIT3:重命名为SO:quote→escape

2 个答案:

答案 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