3

我正在尝试通过一些正则表达式来解决问题;我正在使用python。

我现在的任务是抓取报纸文章并寻找人们死亡的实例。一旦我有一篇相关的文章,我就会尝试为其他一些事情计算死亡人数。我正在尝试提出一些模式,但特别是我遇到了困难。获取此示例文章部分:

萨那,10 月 21 日(路透社)——部落消息人士和当地官员说,周日,美国无人机在也门对一辆汽车发动明显袭击,导致三名被认为是基地组织武装分子的男子丧生。

我用来捕获“三”的代码首先对整个文档进行替换,以便在应用任何模式之前,“三”变为“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 的计数。到目前为止,没有多少摆弄使我能够将范围限制在 men 旁边的数字,然后是分词短语,然后是相关的“被杀”。

任何帮助将非常感激。在 RE 方面,我绝对不是专家。

4

3 回答 3

3

不要做men|women|children可选项,即去掉右括号后的问号。正则表达式引擎将在第一个可能的位置匹配,无论重复运算符是贪婪还是吝啬。

或者,或者另外,使“这里的任何东西”模式只匹配非数字,即替换.*?\D*?

于 2012-11-04T19:12:55.777 回答
2

这是因为,您使用了量词?,它与您的数字匹配或0匹配。所以,会匹配。因为它有他们。1(:?men|women|children|people)210

尝试在它之后删除你的量词,以完全匹配其中一个: -

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")
于 2012-11-04T19:13:59.707 回答
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
于 2012-11-04T19:14:53.230 回答