Python 如何在一个字符串上停止正则表达式与特定模式的匹配?
我试图用python中的正则表达式从纯文本中提取一些表的标题 普通测试是从一些PDF文件导出的,这些文件有很多Python 如何在一个字符串上停止正则表达式与特定模式的匹配?,python,regex,Python,Regex,我试图用python中的正则表达式从纯文本中提取一些表的标题 普通测试是从一些PDF文件导出的,这些文件有很多\ns。在模式\n\n\n首次出现之前,我试图停止匹配,但正则表达式总是返回更多字符 这里有一个例子 字符串是: contents='\n\n\n\n\n\n\n\n\n\n客户:ABC区域:位置Mc\nHole:33-44\n\n\n\nKJK TechCen Rep#5243\n\n\n\n\n\n95\n\n\n表3.1:加入液体L1(P=40\n@12),用2%\n\n\n\n\
\n
s。在模式\n\n\n
首次出现之前,我试图停止匹配,但正则表达式总是返回更多字符
这里有一个例子
字符串是:
contents='\n\n\n\n\n\n\n\n\n\n客户:ABC区域:位置Mc\nHole:33-44\n\n\n\nKJK TechCen Rep#5243\n\n\n\n\n\n95\n\n\n表3.1:加入液体L1(P=40\n@12),用2%\n\n\n\n\n\n\n\n\n\n按REL V\n%\n\n\n\n\nIQ/To\n%\n\n\n\n\n\n\nIQ/Sat\n\n\n
我使用的正则表达式是:
re.findall(r'Table*\d.+:**[a-zA-Z0-9:&–=\n%@,()°-]+[^\n\n]',目录)
我希望结果字符串从'Table XXX'
开始,并在第一个'\n\n'
之前结束,如下所示:
'表3.1:加入液体L1(P=40\n@12),用2%\n\noF进行测试'
但我得到的实际字符串是:
'表3.1:加入液体L1(P=40\n@12),用2%\n\n\n\n\n按V键测试'
因此,我如何修改正则表达式以摆脱恼人的
'\n\n\n PressRel V'
?而不是使用字符类,您可以使用正向前瞻(?=
来断言应该跟随的内容直接在右侧
Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+(?= \n \n\n )
或者,您可以在一个组中捕获您的值,并匹配下面的换行符
(Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+) \n \n\n
您可以使用正向前瞻
(?=
)来声明后面应该直接在右边,而不是使用字符类
Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+(?= \n \n\n )
或者,您可以在一个组中捕获您的值,并匹配下面的换行符
(Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+) \n \n\n
您需要一个非贪婪<代码> + < />代码>而不是<代码> +>代码>,因为在结尾序列中出现的所有字符都在中间括号中。
end = r' \n \n\n '
result = re.findall(r'Table[^:]*:[a-zA-Z0-9 :&–=\n%@,()°-]+?' + end, contents)
#result = ['Table 3.1: Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n ']
# to chop off the end, if needed:
result = [x[:-len(end)] for x in result]
<代码> [^ \n\n\n] < /C>部分等于<代码> [^ \n] ,“不是新行或字符的字符”
您需要一个非贪婪<代码> + < />代码>而不是<代码> +>代码>,因为在结尾序列中出现的所有字符都在中间括号中。end = r' \n \n\n '
result = re.findall(r'Table[^:]*:[a-zA-Z0-9 :&–=\n%@,()°-]+?' + end, contents)
#result = ['Table 3.1: Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n ']
# to chop off the end, if needed:
result = [x[:-len(end)] for x in result]
示例中的
[^\n\n\n]
部分等于[^\n]
,“不是换行符或空格的字符”然后使用前瞻或捕获组,表*\d+:**[A-zA-Z0-9:&-=\n%@,()-+(?=\n\n\n)
,请参阅,或。然后使用前瞻或捕获组,表*\d:**[a-zA-Z0-9:&–=\n%@,()°-]+(?=\n\n\n)
,请参阅,或。此方法也很有效。感谢您对[^\n\n\n]
的解释。此方法也很有效。感谢您对[^\n\n\n]
的解释。