Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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_Arrays_String_Parsing_Substring - Fatal编程技术网

在Python中提取多个子字符串时声明停止位置

在Python中提取多个子字符串时声明停止位置,python,arrays,string,parsing,substring,Python,Arrays,String,Parsing,Substring,我是python新手,正在尝试解析一个长文本字符串,以便在两个完全相同的模式之间找到子字符串。问题在于告诉python在第一次出现结束模式时停止。我还需要将子字符串的所有实例收集到一个数组存储中,以便以后使用。为了简单起见,我试图利用Nikolaus Gradwohl的(re)模块示例。下面是我所做的一个例子 import re string='valuepattern1":"capture",abcdpattern1":"capture2",defg' result = re.search('

我是python新手,正在尝试解析一个长文本字符串,以便在两个完全相同的模式之间找到子字符串。问题在于告诉python在第一次出现结束模式时停止。我还需要将子字符串的所有实例收集到一个数组存储中,以便以后使用。为了简单起见,我试图利用Nikolaus Gradwohl的(re)模块示例。下面是我所做的一个例子

import re
string='valuepattern1":"capture",abcdpattern1":"capture2",defg'
result = re.search('pattern1":"(.*)",', string)
print result.group(1)

Output: capture",abcdpattern1":"capture2"
在这里,我试图收集在(pattern1:“)的设置起点和捕获后的直接终点(“,”)之间的字符串中找到的每个捕获实例(capture和capture2)。收集的每个实例都需要添加到数组中,如下所示

print result
Output: [capture,capture2]
请注意,捕获没有设置的长度,在整个字符串中都是不同的,但是,开始和结束模式在整个字符串中保持一致


提前感谢您对此事的帮助。

您需要更改模式,以便捕获组中的
与结束引号不匹配。我可以找到两种合理的方法:

首先,可以使用非贪婪通配符:
pattern1:“(.*?”
*?
告诉它匹配尽可能少的字符数,而不是尽可能多的字符数


第二个选项是使用字符类从模式的捕获部分排除引号:
pattern1:“([^”]*)”
使用
^
,因为括号中的第一个字符告诉它排除其余字符,所以
[^]
是任何非引号字符。

这个输入应该是JSON还是更大的JSON字符串的一部分?Python有一个JSON解析器。即使它不是JSON,看起来正则表达式解析可能非常脆弱。谢谢@user2357112提供的信息。字符串是一个压缩的JSON文件。我一直在尝试转换不是以前的学生用bash编写的旧脚本,而是python。他们的大部分脚本都包含我不喜欢的正则表达式命令,我也不喜欢这些命令,因为在这种情况下,它们是不切实际的。如果你以前没有做过很多正则表达式的工作,python的实现就不是最友好的。我发现,如果我没有做过,它们会非常有用如果你用@Blckknght测试这个解决方案,你会看到当你使用一个非贪婪的正则表达式时会有什么变化。谢谢你们提供的信息和帮助。Pythex网站对未来的实践非常有用。