2017-04-24 76 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+[^;,]*