求助:如何编写正则表达式匹配指定的目标字符串片段?
解决正则匹配截断的问题
嘿,我明白你的困扰了——原来的正则因为非贪婪匹配的特性,遇到第一个空格就直接停了,所以只拿到了dqweqweqwe这部分。咱们来一步步修正它:
问题根源
你写的regex=r'script=(.*?) .*?='里,.*?是非贪婪模式,它会在遇到第一个满足后续条件的字符(也就是空格)时立刻停止匹配,自然就拿不到后面带空格和换行的完整片段了。
正确的正则写法
我们的目标是匹配script=之后,直到thisCanChange=之前的所有内容(包括换行和空格),可以用正向预查结合DOTALL模式来实现:
import re string='script=dqweqweqwe qewq ewqewqewe$int_qwe$\nintqewwqe wqe thisCanChange=5711' # 开启DOTALL模式让`.`匹配换行,用正向预查定位结束标记 regex=r'(?s)script=(.*?)(?=\s*thisCanChange=)' match_result = re.search(regex, string) if match_result: print(match_result.group(1))
运行这段代码,就能得到你想要的完整片段:
dqweqweqwe qewq ewqewqewe$int_qwe$
intqewwqe wqe
正则各部分解释
(?s):开启DOTALL模式,让.可以匹配换行符(默认.不匹配换行)script=:匹配开头的固定前缀(.*?):非贪婪匹配任意字符(现在包括换行),直到后面的正向预查条件满足(?=\s*thisCanChange=):正向预查,确保当前位置后面跟着零个或多个空格,再加上thisCanChange=——这样匹配就会精准停在目标片段的结尾,不会包含后面的变量定义
替代方案(不用DOTALL)
如果你不想用(?s),也可以用[\s\S]来匹配所有字符(包括换行),正则可以写成:
r'script=([\s\S]*?)\s*thisCanChange='
这种写法和上面的效果完全一致,取group(1)就能得到目标片段。
内容的提问来源于stack exchange,提问作者Narus
相关产品推荐
相关产品推荐

