Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用RE从可能的搜索结果集中选择最小的_Python_Regex - Fatal编程技术网

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]
我怎么才能得到最后一句话呢

我该如何完成整个任务?也就是说,把所有可能的情况都考虑进去。例如

  • 所需的前一句,以
    ]

  • 所需的前一句,以

  • 没有前面的句子。(所需的是批次的第一个)

  • p.S.所需的句子是
    [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]