Python 使用RE从可能的搜索结果集中选择最小的
我想得到Python 使用RE从可能的搜索结果集中选择最小的,python,regex,Python,Regex,我想得到[n]前面的句子,其中n是用户输入的某个数字。如果n=5(如这里所示),两年后,《命运》杂志出版了《我们后门的海洋之谜》,我应该得到这个句子。 我不知道如何开始我的RE。在代码片段中,我假设前面的句子将以]结尾,我在后面接了一个句子。即使这样也不能给我正确的结果 它表明: ] three vertices, in Miami, Florida peninsula, in San Juan, Puerto Rico, and in the mid-Atlantic island of Be
[n]
前面的句子,其中n是用户输入的某个数字。如果n=5(如这里所示),两年后,《命运》杂志出版了《我们后门的海洋之谜》,我应该得到这个句子。
我不知道如何开始我的RE。在代码片段中,我假设前面的句子将以]
结尾,我在后面接了一个句子。即使这样也不能给我正确的结果
它表明:
] three vertices, in Miami, Florida peninsula, in San Juan, Puerto Rico, and in the mid-Atlantic island of Bermuda. Subsequent writers did
not necessarily follow this definition.[2] Some writers gave different boundaries and vertices to the triangle, with the total area varying
from 1,300,000 to 3,900,000 km2 (500,000 to 1,510,000 sq mi).[2] Consequently, the determination of which accidents occurred inside the triangle
depends on which writer reported them.[2] The United States Board on Geographic Names does not recognize the Bermuda Triangle.[2]The earliest
suggestion of unusual disappearances in the Bermuda area appeared in a September 17, 1950 article published in The Miami Herald (Associated Press)
[3] by Edward Van Winkle Jones.[4] Two years later, Fate magazine published "Sea Mystery at Our Back Door",[5]
我怎么才能得到最后一句话呢
我该如何完成整个任务?也就是说,把所有可能的情况都考虑进去。例如
]
[n]
前面的一个句子
注意:上面提供的字符串没有换行符提要(即。\n)。我已经提供了一些来澄清一些事情 您可以这样做(以常规方式),然后选择所需的项目:
>>> res = re.findall(r'([^].!?\[]+[.!?]?)(?:\[(\d+)])?',s.strip())
>>> [x[0] for x in res if x[1]=='5'][0]
' Two years later, Fate magazine published "Sea Mystery at Our Back Door",'
或者你可以直接问:
>>> re.search(r'([^].!?\[]+[.!?]?)\[5]', s.strip()).group(1)
' Two years later, Fate magazine published "Sea Mystery at Our Back Door",'
显然,当句子包含缩写时,这两种幼稚的方法就停止工作了。在这种情况下,您需要添加异常。但要处理这些情况,更好的方法是在[n]
之前提取整个块,然后使用antlr获得最后一句话
第一种方法是使用
re.findall
方法搜索所有“句子”,最后在方括号之间加上一个数字。定义后,此方法仅返回捕获组(而不是整个匹配)。在模式中定义了两个捕获组:第一个用于句子,第二个用于数字;因此,re.findall
返回的列表中的每个项目都是一个元组,包含一个句子和一个数字(或一个空字符串)
第二行(列表理解)仅用于过滤结果,从数字为5的第一个元组中提取句子
图案详情:
( # capture group 1
[^].!?\[]+ # 1 or more characters that aren't: ] [ . ! ?
[.!?]? # an optional punctuation sign
)
(?: # non-capturing group
\[
(\d+) # capture group 2
]
)? # the non-capturing group is optional
给出字符串示例,您可以执行以下操作:
import re
n=5
for m in re.finditer(r'\s*([^\[]*?\[(\d+)\])', s):
if int(m.group(2))==n:
print m.group(1)
印刷品:
Two years later, Fate magazine published "Sea Mystery at Our Back Door",[5]
如果
n=3
,预期输出将是一些作者为三角形给出了不同的边界和顶点,总面积从1300000到3900000平方公里(500000到1510000平方英里)不等。[2]因此,确定三角形内发生了哪些事故取决于报告这些事故的作者。[2]美国地名委员会不承认百慕大三角。[2]关于百慕大地区不寻常失踪的最早建议出现在1950年9月17日《迈阿密先驱报》(美联社)
?还有,关于n=1
?我试着根据输入的数字编写一个动态正则表达式,@WiktorStribiżew No.n=3
应该只显示百慕大地区异常失踪的最早建议出现在1950年9月17日《迈阿密先驱报》(美联社)上的一篇文章中。为了抓住最后一句话,我将整个模式包含在一个可选组中,在组的开头添加可选(0+)空格模式,并在其上应用了一个+
量词。现在,组1只包含在上一次迭代中捕获的零件。前瞻将使每个[number]
失败,因此我们只得到没有[number]
s的部分。@WiktorStribiżew但是n=2
应该只显示[2]
之前的句子,即后续作者不一定遵循此定义。
当n=1
时,它应该只给出[1]
前面的句子。1964年,文森特·加迪斯(Vincent Gaddis)在纸浆杂志《百慕大三角边界的阿戈西》(Argosy)上写道:
。但是这段代码给出了所需语句之前的一整套语句。你能解释一下你的两种方法和它们的正则表达式吗?@TheHardRock:我很快会添加一个更详细的解释。@TheHardRock:没什么要解释的了,它是完全相同的元素。如果在这一行中有什么特别的东西你不明白,请把它隔离出来并询问。@TheHardRock:你不知道什么是字符类吗?在这种情况下,您应该阅读正则表达式教程。好的。我得到了它。非常感谢你。
Two years later, Fate magazine published "Sea Mystery at Our Back Door",[5]