2015-04-02 42 views
2

我想在Python中執行一個正則表達式。我想在沒有域擴展名的文件路徑上進行匹配,另外,我只想得到那些文件路徑的最後一個'\'後最多有20個字符的文件路徑。例如,給定的數據:在同一個正則表達式中引用前一個組?

c:\users\docs\cmd.exe 
c:\users\docs\files\ewyrkfdisadfasdfaffsfdasfsafsdf 
c:\users\docs\files\target 

我想匹配'目標',而不是其他兩行。應該注意的是,在我目前的情況下,使用re模塊或python操作的不是一個選項,因爲這個正則表達式被送入程序(它使用re.match()),所以我在一個正則表達式串。

我有兩個正則表達式:

^([^.]+)$ will match the the last 2 lines 

([^\\]{,20}$) will match 'cmd.exe' and 'target' 

我如何結合這兩種成一個正則表達式?我嘗試了反向引用(?P =等),但無法使其工作。這甚至有可能嗎?

+1

就像'^(。* \\)+ [^ \。] {0,20} $'你想要什麼?根據https://regex101.com/這個作品... – Xufox 2015-04-02 05:14:54

+0

嗯,似乎得到正確的線,但不是它得到了整條線,而不是'目標' – jeffrey 2015-04-02 05:19:14

+0

哎,這有點困難......你可能需要信任「lookbehinds」......你真的想走那麼遠嗎? – Xufox 2015-04-02 05:20:34

回答

2

如何\\([^\\.]{1,20})(?:$|\n)?它似乎爲我工作。

  • \\被轉義字面反斜槓。
  • (捕獲組的開始。
  • [^\\.]匹配任何東西,除了反斜槓或文字點字符
  • {1,20}匹配類1-20次,多次地(貪婪)。
  • )結束捕獲組。
  • (?:啓動一個非捕獲組
  • $匹配字符串的末尾。
  • |是此組
  • \n的「或」操作者換行或換行字符(ASCII 10)的
  • )端匹配非捕獲組

要創建此,我使用https://regex101.com/#python這在我看來是一個非常好的資源,因爲它解釋了正則表達式的每個部分,並實時顯示捕獲的組。

+0

這對我有效......你是怎麼做到的?心靈在我身邊走過嗎? – jeffrey 2015-04-02 05:23:50

+1

實際上這是更聰明的一個...它在結尾('$')選擇最多20個不是'.'或'\'('[^ \\。]')的字符。但是,它不應該是'[^ \\\。]「嗎? – Xufox 2015-04-02 05:28:00

+1

@Xufox我認爲你可以做到這一點。在一個字符類中,'.'被字面解釋,你不需要轉義它。 – Shashank 2015-04-02 05:36:46

1
>>> s = r"""c:\users\docs\cmd.exe 
... c:\users\docs\files\ewyrkfdisadfasdfaffsfdasfsafsdf 
... c:\users\docs\files\target""".split('\n') 
>>> [re.match(r'.*\\([^.]{,20})$', x) for x in s] 
[None, None, <_sre.SRE_Match object at 0x7f6ad9631558>] 

這意味着:

.*\\ - 抓住一切直到幷包括最後\
([^.]{,20}) - 確保有在剩下的高達20個字符
沒有. $ - 行尾

圍在中間組()表明它應是一個組返回匹配

+0

這抓住了'c:\\ users \\ docs \\ files \\ target'這一行,但我正在尋找'target' – jeffrey 2015-04-02 05:28:04

+0

@jeffrey,很容易修復。我只是誤解 – 2015-04-02 05:30:12

相關問題