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/
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的正则表达式,也可以使用一个多步骤过程,将字符串拆分并保存最后的分隔符,然后将这些部分重新添加到一起。您真的希望在所有这些表单中进行筛选,还是希望将所有可能的传入表单合理化为一个输出表单?是否有任何原因无法用于标准化您的路径?我正在测试应用程序跨多个分支生成的报告,因此我被迫筛选所有可能的路径。这是正是我需要的。谢谢