我的正则表达式遇到一些问题。
我有一些像这样的行:
SomeText#"C:\\","Shadow Copy Components:\\","E:\\",""
SomeText#"D:\\"
SomeText#"E:\\","Shadow Copy Components:\\"
SomeText#"SET SNAP_ID=serv.a.x.com_1380312019","BACKUP H:\\ USING \\\\?\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy47\\ OPTIONS:ALT_PATH_PREFIX=c:\\VERITAS\\NetBackup\\temp\\_vrts_frzn_img_3200\"
SomeText#"SET SNAP_ID=serv.a.x.com_1380312019","BACKUP Y:\\Libs USING \\\\?\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy47\\ OPTIONS:ALT_PATH_PREFIX=c:\\VERITAS\\NetBackup\\temp\\_vrts_frzn_img_3200\"
我想要的是获得一个名为 jobFileList 的组,其中每行包含:
"C:\\","Shadow Copy Components:\\","E:\\",""
"D:\\"
"E:\\","Shadow Copy Components:\\"
H:\\
Y:\\Libs
你可以看到我只想要文件列表,但有时它只是 # 标记后的全文,有时有很多 ** 我需要删除。 事实上,我无法在这种情况下使用脚本,因此我只需要使用一个正则表达式来完成此操作,不能只在正则表达式之后进行其他内容的替换。
我所做的是:
SomeText(#.*BACKUP (?P<jobFileList>.*?) .*)?(#(?P<jobFileList>.*))?
但似乎我无法设置相同的 GroupName :( 如果我将第二个 jobFileList 替换为另一个名称,它可以正常工作,但不是我需要的。
感谢您的帮助,
编辑: 我还可以有一些像这样的行:
SomeText#/ahol5d72_1_2
SomeText#/p7ol4a1p_1_2
SomeText#Gvadag04SANDsk_Daily
SomeText#/bck_reco_a9ol5765_1_2_827497669
在所有这些情况下,我需要将所有文本放在 # 标记之后。
最佳答案
不依赖双反斜杠后的双引号的版本:
SomeText#(?:(.*?BACKUP) )?(?P<jobFileList>(?(1)[^ ]*|.*$))
This: (?(1)[^ ]*|.*$)
是 Python 2.7.5 支持的条件组(可能适用于更高版本,但我不知道对于以前的)。如果有 BACKUP
,它会抓取所有非空格,如果没有 BACKUP
,它会抓取所有内容,直到字符串末尾。
编辑:根据评论,@timmalos 修改后有效的正则表达式:
\#(?P<G>.*?[^E]BACKUP\s)?(?P<G2>f:\\\\Mailbox\\\)?(?P<jobFileList>(?(G)(?(G2)[^\]|\S)*|.*))
关于regex - Splunk 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19091684/