如何用正则表达式提取所有符合「介于两个特定字符串a和b之间」这一条件的内容?

例如有这样一段文本(无标点符号):

请问您的姓名是什么姓名张三对吗

现在需要提取姓名,即"张三"。需要提取的姓名,位于"姓名"和"对"这两个固定的字符串之间,故使用以下正则表达式规则:

(?<=姓名)(.*?)(?=对)

提取结果只有一条,如下:

是什么姓名张三

请问怎样的正则表达式可以完整地返回以下两个结果:

是什么姓名张三

张三

2个回答

完整地返回以下两个结果:
(?<=姓名)(.*?((?<=姓名).*?)?)(?=对)/)
第一个子匹配结果:是什么姓名张三
第二个子匹配结果:张三

如果要直接获取“张三”
(?<=姓名)((?:(?!姓名).)*?)(?=对)

u012163199
Xeon AMG 回复天际的海浪: 非常感谢!
一年多之前 回复
jslang
天际的海浪 回复Xeon AMG: (?<=姓名)(.*?((?<=姓名).*?)?)(?=对)
一年多之前 回复
u012163199
Xeon AMG 感谢您的回答!第二条规则可以工作,但第一条规则运行时会报错,请问如何解决呢?
一年多之前 回复

不用这么复杂把!你这里主要是想搞清楚一个贪婪和非贪婪匹配的区别。
我理解贪婪程序是从姓名开始找,找到第一个对结束。然后再往后找第二个对。所以我认为 (?<=姓名)(.*?)(?=对) 非贪婪匹配就是是什么姓名张三
第一个匹配我就不说了。我觉得第二个匹配这么写你可能好理解一些。
re.search(r'(?<=姓名).*(?<=姓名)(.*)(?=对)',youstr)
re.search(r'(?<=姓名)(.{2,4})(?=对)'youstr)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐