Python 如何检查一个字符串是否介于两个字符串之间,并使用正则表达式返回以下字符

Python 如何检查一个字符串是否介于两个字符串之间,并使用正则表达式返回以下字符,python,regex,string,Python,Regex,String,我想检查一个字符串是否在文本文件中,在其他两个字符串之间,如果为true,则返回与正则表达式匹配的下一个字符串 我不知道如何实现它 既然你可能听不懂我的解释,我会用我的问题更好地解释: 我正在创建一个应用程序(python)读取pdf并将其转换为.txt 在这个文本中,我想找到pH并返回它。我知道我会在第10节和第11节之间找到它,如下所示: 10. blablablablabla pH 7,6 blablablabla 11. 所以 如何将我的研究减少到“10.”和“11.” 对于pH部分,

我想检查一个字符串是否在文本文件中,在其他两个字符串之间,如果为true,则返回与正则表达式匹配的下一个字符串

我不知道如何实现它

既然你可能听不懂我的解释,我会用我的问题更好地解释:

我正在创建一个应用程序(python)读取pdf并将其转换为.txt

在这个文本中,我想找到
pH
并返回它。我知道我会在第10节和第11节之间找到它,如下所示:

10. blablablablabla pH 7,6 blablablabla 11.
所以

  • 如何将我的研究减少到
    “10.”
    “11.”
  • 对于pH部分,我认为这类似于:

    如果“pH”处于打开状态(文件).read():

  • 如果我们找到'ph',我如何编码我希望下一个字符串遵守这个正则表达式:
    re.search([0-9]{1}[,.]?[0-9]?,file)


  • 假设你可以在234点放任何你想要的东西,这应该是可行的。这将返回匹配“234”的pH符号后的所有内容

    抽象地,这会查找与以下模式匹配的字符串:
    start\u pattern通配符pre\u pattern wildcard captured\u pattern wildcard end\u pattern
    所有通配符都是
    *
    ,与任何字符的0个或多个匹配。捕获的模式位于两个大括号
    (my_模式)
    之间,在本例中为
    234

    为了更好地说明我的最后一点,下面是上面的变量:

    import re
    
    start_pattern = "10\."
    end_pattern = "11\."
    pre_pattern = "pH"
    wildcard = '.*'
    captured_pattern = "234"
    
    my_str = "10. blablablablabla pH 1234 11. 234"
    
    match_list = re.findall(r''
                            + start_pattern
                            + wildcard
                            + pre_pattern
                            + wildcard
                            + '(' + captured_pattern + ')'
                            + wildcard
                            + end_pattern
                            , my_str)
    
    print(match_list)
    

    我将使用以下方法:

    regex = re.compile(r"\b10\.(?:(?!\b11\.|\bpH\b).)*\bpH\b\s*(\d+(?:[.,]\d+)?)(?=.*\b11\.)", re.DOTALL)
    pH = regex.search(my_string).group(1)
    
    测试一下

    只有在
    10.
    11.
    之间找到pH值,并且如果有多个pH值,它才会找到第一个pH值

    说明:

    \b10\。#第十场。(但不是110。)
    (?:#匹配的(重复)组的开始。。。
    (?!#)(如果我们两个项目都没有开始。。。
    \b11\。#数字11。
    |#或
    \bpH\b#字符串pH
    )            #   )
    .#任何字符(包括换行符,因此为DOTALL选项)。
    )*#必要时重复。
    \bpH\b#匹配字符串pH
    \s*#匹配可选空格
    (#在第1组中匹配并捕获:
    \d+#至少一位数字
    (?:[,]\d+)#可选后跟小数部分
    )#捕获组结束
    (?=#断言之后可以匹配以下内容:
    .#任意数量的字符
    \b11\。#后接11。
    )#结束先行断言。
    
    如果我理解正确,我假设以
    10开头的行总是以
    11结尾。
    。如果是这样,我们只需要找到
    10.
    并检查后面的内容:

    10\.\s.+(?<=pH )(\d[.,]?\d)(?=\s)
    

    您所说的“我希望下一个字符串遵守此正则表达式”是什么意思?对于示例字符串,您能更明确地给出您想要返回的内容吗?很抱歉不清楚。。。我的意思是:我的循环找到了“pH”,所以我想返回下一个字符串,跟在等于我的正则表达式的“pH”后面。在上面的示例中,pH后面等于我的正则表达式的下一个字符串是“7,6”,因此我想返回7,6。我希望足够清楚!这不会将搜索限制在
    10.
    11.
    之间的部分。注意。。。我刚刚对正则表达式进行了额外的更新,希望能够解释这一点。在第一个示例中,您可能不需要
    ph.*(234)
    ,因为OP似乎希望数字紧跟在ph之后。最好是
    ph\s*(234
    ,因为这将ph和数字之间的值限制为空白字符,这是一种干净快速的处理方法,但我提出了两个错误:1.“模块”对象没有属性“单线”2.“非类型”对象没有属性“组”任何线索?哦,应该是DOTALL-这应该可以解决它。第二个错误意味着没有匹配项-可能是第一个错误的结果。也没有单行线,我在python文档中找不到单行线,你确定这个词吗?这似乎是准确的。但每当你有时间,我都会很高兴听到更多关于正则表达式如何工作的解释!试图弄清楚正则表达式101的原理不,这不是关于行的,因为我们可以有很多行在“10.”和“11.”中,文档以“1”开头,直到“16.”,所以我需要两个边框
    10\.\s.+(?<=pH )(\d[.,]?\d)(?=\s)
    
    \b10\.\s.+(?<=pH )(\d[.,]?\d)\s.+?\b11\.