如何在Python中使用异或的2个或更多正则表达式?

时间:2014-12-24 21:27:57

标签: python regex

我有一个正则表达式,可以在几个HTML源上找到一封电子邮件mailto:(.*)\"|(\S+@+\S*)|(.{1,40}@.{1,40})

Email: <u><a href="mailto:test@test.com">email me字符串mailto:(.*)\"很有效,

我希望它停在那里并返回值而不是继续其他表达式。有没有类似XOR运算符或者这样做的方法,因为我最终必须添加更多的部分?

我在这里试过:http://pythex.org/

2 个答案:

答案 0 :(得分:0)

正则表达式应该自然地这样做。为了说明这一点,将一个单词与一个例外进行匹配的简单方法之一是在匹配异常之前并使用替换。

例如,在我的电子邮件程序中,我需要将主题行/labels?/的所有电子邮件分类到另一个文件夹。然而,我的一些联系人从未学过如何拼写(显然),我也排序/lables?/但是我发现包含主题行Available的电子邮件也被此过滤器接收。

我本可以做/\blables?/但更喜欢抓住available并单独处理,所以我做了:

`/available|(lables?)|(labels?)/`

此次更改将与available匹配,但仅匹配并捕获lablelableslabellabels

答案 1 :(得分:0)

正如亚当·斯密所说,你遇到的问题是你的最后一次轮换.{1,40}@.{1,40}在其他轮换之前开始匹配,所以它会消耗文本,这就是返回的匹配。 / EM> 为了解决这个问题,您可以通过预先.*? e来修改其他部分模式,以便它们尽可能早地匹配。 G。 .*?mailto:(.*)\"|.*?(\S+@+\S*)|(.{1,40}@.{1,40})。 或者,也许有点不那么复杂,你可以只搜索一个接一个:

string = 'Email: <u><a href="mailto:test@test.com">email me'
m = re.search('mailto:(.*)\"',     string) \
 or re.search('(\S+@+\S*)',        string) \
 or re.search('(.{1,40}@.{1,40})', string)
print(m.group(1))