Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 如何在一个字符串上停止正则表达式与特定模式的匹配?_Python_Regex - Fatal编程技术网

Python 如何在一个字符串上停止正则表达式与特定模式的匹配?

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\

我试图用python中的正则表达式从纯文本中提取一些表的标题

普通测试是从一些PDF文件导出的,这些文件有很多
\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]
的解释。