2017-04-24 73 views
2

我從網頁中提取了一個長字符串。使用:有兩種可能性的子字符串正則表達式

x=re.findall(r"(?:l'article)\s\d+\w+.*;", xpath) 

它提取以下2個字符串:

l'article 1382 du code civil ; 
l'article 700 du code de procédure civile, les condamne à payer à la société Financière du cèdre la somme globale de 3 000 euros et rejette leurs demandes ; 

然而,後者是有點長。我所需要的就是'''。有沒有辦法直接做到這一點?所以我的原始正則表達式命令查找';'或','的基礎上,它遇到的第一個。

如果不是,我可以將正則表達式應用於列表,還是我需要爲此編寫一個循環?

所需取得的成果與列表:

l'article 1382 du code civil 
l'article 700 du code de procédure civile 

注意,我有這個適用於許多頁面,並可能有更多的這些在一個頁面中。手動或通過在列表中明確指定條目來做任何事情都是不可能的。

回答

3

一些東西,你似乎錯過了非常規操作符?,以強制正則表達式在找到第一個匹配項後停止搜索。此外,您可以使用[](請參閱以下內容)檢查多個字符。這裏將是新代碼:

(?:l'article)\s\d+\w+.*?[;,] 

Regex101:

https://regex101.com/r/tYkNHK/1

+1

爲什麼不'[;,]'?使用're.findall'時,您的代碼將只在您創建捕獲組時纔會返回';'或','。 –

+0

@SebastianProske更新了代碼,感謝您的輸入。 – Neil

+0

謝謝。我原本以爲這是你以前提供的?(; |,)答案。但是這提供了一個列表;和,。 (對不起,我沒有提供自己的嘗試來解決這個問題)。謝謝你解釋爲什麼發生這種情況@SebastianProske。 – Peter

2

您可以簡化您的正則表達式很多:

  • (?:l'article) - >沒有必要非所以你可以刪除它
  • \s\d+\w+ - >檢查\w+似乎相當毫無意義(特別是因爲這匹配數字沒有字母),所以我認爲你可以刪除它。或者你缺少一個空格字符以匹配例如1382 du
  • .*;匹配任何最大爲,;您可以簡單地使用否定字符類,如[^;,]*這將匹配所有不屬於那些的東西。

因此,最終的正則表達式可能是要麼

l'article\s\d+[^;,]* 

l'article\s\d+\s\w+[^;,]*