Regex 如果存在多个,则留下一个的正则表达式

Regex 如果存在多个,则留下一个的正则表达式,regex,python-2.7,Regex,Python 2.7,我必须过滤路径,它们可能看起来像: some\u path//rest 一些路径/休息 some\u path\\\\rest some\u path\rest 我需要用过滤器替换一些路径//rest 一些路径/rest/我想要过滤器/ 一些路径/rest\\我想要过滤器\ 一些路径/rest我想要过滤器 一些路径/rest/我想要FILTER/ 一些路径/rest\我想要过滤器\ 我使用some\u path[\\\/]+rest来匹配中间部分,如果我在最后使用它,它会消耗所有的路径分

我必须过滤路径,它们可能看起来像:

  • some\u path//rest
  • 一些路径/休息
  • some\u path\\\\rest
  • some\u path\rest
我需要用过滤器替换一些路径//rest

  • 一些路径/rest/
    我想要
    过滤器/
  • 一些路径/rest\\
    我想要
    过滤器\
  • 一些路径/rest
    我想要
    过滤器
  • 一些路径/rest/
    我想要
    FILTER/
  • 一些路径/rest\
    我想要
    过滤器\
我使用
some\u path[\\\/]+rest
来匹配中间部分,如果我在最后使用它,它会消耗所有的路径分隔符

我事先不知道分离器是
/
还是
\\
它可以在一条路径中混合。
some\u path/rest\some\u more//and/more\\\\more

考虑使用反向引用。请记住,使用Python时,您将看到输出中第二个
\
转义的
\
。此示例似乎满足了您的要求:

>>> for test in ('some_path/rest//','some_path/rest\\','some_path/rest','some_path/rest/','some_path/rest\\'):
...     re.sub(r"some_path[\/]+rest([\/]?)\1*", r"FILTER\1", test)
... 
'FILTER/'
'FILTER\\'
'FILTER'
'FILTER/'
'FILTER\\'
>>> 

\1
是对上一个
()
组的反向引用。在搜索中,它将搜索该项目的任意数量的匹配项。在replace中,它只是添加了一个项目。

您可以使用一个简单的替换术语(无需反向引用),通过使用look-ahead进行替换

使用此正则表达式搜索:

some_path[\\\\/]+rest(?:([\\\\/])(?=\1))?
并将匹配项替换为“过滤器”:

re.sub(r"some_path[\\\\/]+rest(?:([\\\\/])(?=\1))?", 'FILTER', path)
只有在尾部斜杠加倍时,才匹配(即使用)尾部斜杠

考虑到没有尾随斜杠时,尾随斜杠的匹配是可选的,方法是使用
(?:…)?
(这是非捕获的,因此后面的引用是
\1
,而不是较难阅读的
\2

注意,在正则表达式中不需要太多反斜杠


下面是一些测试代码:

for path in ('some_path/rest//','some_path/rest\\','some_path/rest','some_path/rest/','some_path/rest\\'):
    print path + ' -> ' + re.sub(r"some_path[\\\\/]+rest(?:([\\\\/])(?=\1))?", 'FILTER', path)
输出:

some_path/rest// -> FILTER/                                                                                                                                                     
some_path/rest\ -> FILTER\                                                                                                                                                      
some_path/rest -> FILTER                                                                                                                                                        
some_path/rest/ -> FILTER/                                                                                                                                                      
some_path/rest\ -> FILTER\    

这不是我真正需要的。根据我的问题,我只需要一个向前或向后的斜杠。如果可能的话,我宁愿不在替换的值中添加正则表达式。根据答案,附加的
`只是实际的
`的转义。请尝试打印re.sub(r“some\u path[\/]+rest([\/]?)\1*”,r“FILTER\1”,test)
,它应该在不显示额外“`”的情况下显示。sub()使用regex作为替换字符串,但除此之外,您还要求使用regex替换。您可以选择使用一个带有一个backreference的正则表达式,也可以使用一个多步骤过程,将字符串拆分并保存最后的分隔符,然后将这些部分重新添加到一起。您真的希望在所有这些表单中进行筛选,还是希望将所有可能的传入表单合理化为一个输出表单?是否有任何原因无法用于标准化您的路径?我正在测试应用程序跨多个分支生成的报告,因此我被迫筛选所有可能的路径。这是正是我需要的。谢谢