Python 如何将管道操作符用作正则表达式的一部分?

Python 如何将管道操作符用作正则表达式的一部分?,python,regex,Python,Regex,我想在字符串中匹配url,如 u1 = "Check this out http://www.cnn.com/stuff lol" u2 = "see http://www.cnn.com/stuff2" u3 = "http://www.espn.com/stuff3 is interesting" 类似于下面的一些方法很有效,但是很麻烦,因为我必须重复整个模式 re.findall("[^ ]*.cnn.[^ ]*|[^ ]*.espn.[^ ]*", u1) 特别是,在我的真实代码中,

我想在字符串中匹配url,如

u1 = "Check this out http://www.cnn.com/stuff lol"
u2 = "see http://www.cnn.com/stuff2"
u3 = "http://www.espn.com/stuff3 is interesting"
类似于下面的一些方法很有效,但是很麻烦,因为我必须重复整个模式

re.findall("[^ ]*.cnn.[^ ]*|[^ ]*.espn.[^ ]*", u1)
特别是,在我的真实代码中,我希望匹配更多的网站。理想情况下,我可以做类似的事情

re.findall("[^ ]*.cnn|espn.[^ ]*", u1)
但是现在它当然不起作用了,因为我没有正确指定网站名称。如何才能做得更好?谢谢。

非分组匹配

re.findall("[^ ]*.(?:cnn|espn).[^ ]*", u1)

我称之为“非分组括号”;“matches”这个词很容易混淆,因为REs也使用了不同的含义。答案中
的所有实例都应该转义,否则它将匹配任何包含
espn
cnn
的内容,例如昨晚cnn上有
,这不是所需的匹配项。请注意,对于当前的模式,这将生成一个匹配项:
re.findall([^]*.cnn.[^]*.[^]*.espn.[^]*,'abc.espnw.abc')
,因为点匹配所有字符。你需要避开这个点:
re.findall([^]*\.cnn\.[^]*.[^]*\.espn\.[^]*“,'abc.espnw.abc')
谢谢,有时候我不是很小心。。。