2012-11-04 187 views
3

我想通过一些正则表达式工作;我正在使用python。非贪婪python正则表达式

我现在的任务是刮报纸文章,并寻找人死亡的情况。一旦我有一篇相关的文章,我试图扼杀其他一些事情的死亡人数。我试图想出一些模式,但是我特别是遇到了一些困难。把这个样本文章节:

SANAA,10月21日(路透社) - 三个男人被认为是基地组织武装分子 在一辆汽车在也门明显的美国无人机袭击中丧生的 周日,部落人士和本地官员说。

我用来首先拦截'三个'的代码在整个文档上进行替换,因此在应用任何模式之前,'3'变成'3'。有关本实施例的图案是这样的:

re.compile(r"(\d+)\s(:?men|women|children|people)?.*?(:?were|have been)? killed") 

的想法是,这种模式会以数字开头,后跟一个可选的名词如列出的那些中的一个,那么具有杂乱的最小量的前发现“死亡”或“死亡”。我要离开房间,使这种模式会赶上:

3 people have been killed since Sunday 

,仍然赶上实例的例子:

3 men thought to be al qaeda militants were killed 

的问题是,我使用的模式是从收集的日期文章的第一部分,并返回21的计数。到目前为止,没有任何的摆弄使我可以将范围限制在男士一词旁边的数字右边,然后是分词,然后相关的“被杀”。

任何帮助将不胜感激。谈到RE,我绝对没有上师。

回答

3

请勿使men|women|children为可选项,即在右括号之后取出问号。无论重复操作符是否贪婪或吝啬,正则表达式引擎都会在第一个可能的位置进行匹配。

或者,或另外,使“任何事情在这里”模式只匹配非数字,即与\D*?

+0

的\ d工作,似乎最有意义语法明智的,最具可扩展性。 – hyleaus

2

更换.*?这是因为,你已经使用了量词?,符合你(:?men|women|children|people)01在你的位后。因此,21将匹配。因为它有0

尝试删除后您的量词,与它们匹配的只有一个: -

re.compile(r"(\d+)\s(?:men|women|children|people).*?(?:were|have been)? killed") 

更新: - 要使用? quantifier,仍然可以得到所需的结果,您需要使用Look-Ahead正则表达式,使确保你的digit没有跟在你的例子中包含hiephen(-)的字符串。

re.compile(r"(\d+)(?!.*?-.*?)\s(?:men|women|children|people)?.*?(?:were|have been)? killed") 
+0

指定一个明确的重复计数是完全多余的。 – tripleee

+0

我不想要{1},因为可能有文章中说'3在星期天在爆炸中遇难'的实例...' – hyleaus

+0

@tripleee。对,是真的。我引用了那个东西。但是'{1}'给了他一种使用另一个“量词”的方法。 –

0

您使用错误的语法(:?...)。您可能想使用(?:...)


使用正则表达式

(\d+).*?\b(?:men|women|children|people|)\b.*?\b(?:were|have been|)\b.*?\bkilled\b 

,或者只是空间的那些话之间不允许,那么

(\d+)\s+(?:men|women|children|people|)\s+(?:were|have been|)\s+killed\b 
+0

你是对的。这是错误的语法,但因为我只对.group(1)感兴趣,所以它不会影响结果。感谢您的关注。 – hyleaus