在Python中提取多个子字符串时声明停止位置
我是python新手,正在尝试解析一个长文本字符串,以便在两个完全相同的模式之间找到子字符串。问题在于告诉python在第一次出现结束模式时停止。我还需要将子字符串的所有实例收集到一个数组存储中,以便以后使用。为了简单起见,我试图利用Nikolaus Gradwohl的(re)模块示例。下面是我所做的一个例子在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('
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网站对未来的实践非常有用。