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