正则表达式垂直条

时间:2015-07-10 02:02:14

标签: python regex

我希望在1中找到所有这些匹配:

http://somewebsite/usr/blah_blah

http://somewebsite/ch/blah_blah_blah

我尝试使用垂直条但没有去

matches = re.findall('http://somewebsite/(usr|ch)/(.*?)', line, re.DOTALL)

我不想做两个单独的正则表达式,而是希望使用垂直条(OR)使用一个正则表达式的blah_blah和blah_blah_blah

有什么建议吗?请帮忙。感谢。

3 个答案:

答案 0 :(得分:1)

如果您想从http链接开始匹配整行,那么您必须做两件事。

  1. 删除正则表达式中http之前的空格。

  2. 将所有捕获组变为非捕获组。

  3. 将非贪婪的正则表达式变为绿色。

  4. 所以你的正则表达式必须是,

    matches = re.findall(r'\bhttp://somewebsite/(?:usr|ch)/.*', line, re.DOTALL)
    

    如果您只想获取usrch之后存在的部分,请仅将捕获组应用于以下.*

    matches = re.findall(r'\bhttp://somewebsite/(?:usr|ch)/(.*)', line, re.DOTALL)
    

答案 1 :(得分:1)

有几件事需要做。如上所述,删除它所处理的空白区域,就好像有一个空白区域。接下来,您无法转义/字符。最后,问号字符告诉表达式停止查看某个位置。请尝试以下方法。

 matches = re.findall('http:\/\/somewebsite\/(usr|ch)\/.*', line, re.DOTALL)

最后,括号可用于验证数据。如果你想要完整的地址,请把它留下来。在python组0中将具有完全匹配。在java和大多数其他语言中也是如此。这似乎是python所以[匹配中x的[x [0]]将给出整个链接的列表。

以下site提供了更多信息。

答案 2 :(得分:0)

为了给你一个更一般的例子;实际上最合适的解决方案可能取决于一些尚未给出的信息:

    test1 = "xxx http://somewebsite/usr/blah_blah/baff_blaff"
    test2 = "yyy http://somewebsite/log/blah_blah_blah"
    test3 = "zzzzhttp://somewebsite/ch/blah_blah_blah_blah/ ZZZ"

    matches = re.findall(r'http://somewebsite/(?:usr|ch)/(\w*)', test1 + '\n' + test2 + '\n' + test3)

    print(matches)


>>> ['blah_blah', 'blah_blah_blah_blah']