2014-02-26 39 views
0

我想提取':'和'|'之間的文本字符,但在第二和第三數據有後的一個空格 ':'可變長度Lookbehinds RegEx在Python中不起作用

的intput:

Referencia:22726| Referencia Cliente Ak: 233726 | Referencia histórica: 256726 | Suelo | AGOLADA (Pontevedra) - CARPAZO O PE#A LONJA [EXTRACT] 
Referencia:39766| Referencia Cliente Ak: 39767 | Referencia histórica: 39768 | Garaje | MOJACAR (Almería) - URB.VILLA MIRADOR DEL MAR - MOD. # [EXTRACT] 
Referencia:397A5| Referencia Cliente Ak: 397B5 | Referencia histórica: 397C5 | Garaje | MOJACAR (Almería) - VILLA MIRADOR DEL MAR-MODULO #-PLAZA 4 [EXTRACT] 
Referencia:AA39803| Referencia Cliente Ak: P_39803 | Referencia histórica: 200_39803 | Garaje | MOJACAR (Almería) - VILLA MIRADOR DEL MAR - MODULO [EXTRACT] 

輸出期望:

22776 
233726 
256726 
39766 
39767 
39768 
397A5 
397B5 
397C5 
AA39803 
P_39803 
200_39803 

我的第一圖案:(?<=:)(\w{5,12}) 這僅匹配第一列。

我的第二個模式:(?<=:\s)(\w{5,12}) 此相匹配的第二和第三列

所以,我認爲,我的第三個模式是正確的:(?<=:\s?)(\w{5,12})這種模式不工作。

+1

可以使用'regex'模塊,它支持在向前看符號和lookbehinds可變長度。他們說,計劃替換標準的「重新」模塊。你可以用Pip安裝它。 ('pip install regex')。 – Shule

回答

2

一個回顧後不能在python可變長度。一種方法來解決這個問題:

(?:(?<=:\s)|(?<=:))(\w{5,12}) 

但是,由於您使用捕獲組,一個回顧後也沒用:

:\s?(\w{5,12}) 
+0

哦,謝謝。我不知道在python中lookbehind不能變長。我想這既不是前瞻。但是,它是僅在python或其他語言中。 – Trimax

+0

一個lookahead可以是可變長度的。 –

+0

使用.net,您可以使用可變長度的後視。 Java允許使用這個量詞'{n,m}',PHP允許改變。 –

1

刪除在回顧後的?字符移動\s到比賽

(?<=:)(\s?\w{5,12}) 
+0

謝謝,優雅的解決方案! – Trimax

+0

@Trimax沒關係 – Nambi