我有一个文本引用列表,如下所示,其中粗体文本是我希望使用re.findall()提取的文本.

10.T·贝斯利,政治选拔.J·伊肯.透视.19、43-60(2005).11.J.D.Fearon,剑桥大学在民主理论、民主、责任和代表性方面的研究,A.Przeworski,B.Manin,S.C.Stokes,EDS.(剑桥大学Press,1999),PP.55-97.12.B.B.de Mesquita,A.Smith,《独裁者手册:为什么不良行为几乎总是好的政治》(Hachette UK,2011).13.S.Wong,S.E.Guggenheim,"社区驱动的发展:神话与现实"(WPS8435,世界银行,2018年),页.1-36.14.A.Beath、F.Christia、R.Enikolopov,《直接民主和资源分配:来自阿富汗的实验证据》.J.Dev.经济学人.124、199-213(2017).15.B.A.奥尔肯,《直接民主和地方公共产品:来自印度尼西亚实地试验的证据》.上午好.波利特.SCI.牧师.104、243-267(2010).16. A. BLAKE, M. J. GILLIGAN, INTERNATIONAL INTERVENTIONS TO BUILD SOCIAL CAPITAL: EVIDENCE FROM A FIELD EXPERIMENT IN SUDAN. AM. POLIT. SCI. REV. 109, 427–449 (2015)‘

基本上,我想获取引文编号(这里,16),后面跟着感兴趣的引文,直到引文发表的年份(这里,2015).因为我在列表中有第一个作者的姓氏,所以我可以使用‘Blake’作为关键字,但其他所有内容都需要使用regex进行匹配.

到目前为止,我已经try 过了:

re.findall('\d+?.*?BLAKE.*?\d{4}', refer, re.DOTALL)

但这抓住了上面的一切,因为\d+个匹配的是‘10’,而不是‘16.’.我以为.*?会最小化数字和Blake之间的字符串匹配,但事实并非如此.另一种 Select 是给出一个范围,而不是.*,比如re.findall('\d+?{0,5}BLAKE.*?\d{4}', refer, re.DOTALL),但我对许多其他文本这样做,我不能提前知道参考数字和第一作者的姓氏之间会有多少文本.

有没有办法获取关键字(布莱克)之前的最新数字(这里是16)?或者一种最小化数字和关键字之间搜索的方法?

推荐答案

如果你保证在参考号码和你要搜索的"关键字"之间没有任何其他数字,下面的方法应该可以做到这一点:

re.findall('\d+?[A-Z\.\s,]+BLAKE.*?\d{4}', text, re.DOTALL)

关于这一点的解释,表达式[A-Z\.\s,]+是一个字符类,它将匹配任何大写字母、文字.、空格和逗号.

我刚才重读了你的问题,你说你只想提取数字,而不是整个引用.对此,尼克的回答就足够了.不过,我会把我的答案留在这里,以防它有助于回答任何其他问题.

Python相关问答推荐

回归回溯-2D数组中的单词搜索

当pip为学校作业(job)安装sourcefender时,我没有收到匹配的分发错误.我已经try 过Python 3.8.10和3.10.11

Polars Select 多个元素产品

从DataFrame.apply创建DataFrame

如何用symy更新分段函数

对Numpy函数进行载体化

try 在树叶 map 上应用覆盖磁贴

如何记录脚本输出

Python库:可选地支持numpy类型,而不依赖于numpy

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

如何使用pytest来查看Python中是否存在class attribution属性?

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

将tdqm与cx.Oracle查询集成

我对我应该做什么以及我如何做感到困惑'

Django RawSQL注释字段

python中的解释会在后台调用函数吗?

UNIQUE约束失败:customuser. username

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

为什么if2/if3会提供两种不同的输出?

python中csv. Dictreader. fieldname的类型是什么?'