我希望在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
有什么建议吗?请帮忙。感谢。
答案 0 :(得分:1)
如果您想从http
链接开始匹配整行,那么您必须做两件事。
删除正则表达式中http
之前的空格。
将所有捕获组变为非捕获组。
将非贪婪的正则表达式变为绿色。
所以你的正则表达式必须是,
matches = re.findall(r'\bhttp://somewebsite/(?:usr|ch)/.*', line, re.DOTALL)
如果您只想获取usr
或ch
之后存在的部分,请仅将捕获组应用于以下.*
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']