Python 使用正则表达式搜索文本的多个重复模式

Python 使用正则表达式搜索文本的多个重复模式,python,regex,Python,Regex,我试图从一个文档中搜索文本,它有重复的部分,并且在文档中多次出现。但是,使用regex.match,它只显示文档中的第一个匹配项,而不显示其他匹配项 我要搜索的模式如下所示: clauses 5.3, 12 & 15 clause 10 C, 10 CA & 10 CC 下一行显示了我正在使用的正则表达式 regex_crossref_multiple_1=r'(clause|Clause|clauses|Clauses)\s*\d+[.]?\d*\s*[a-zA-Z]*((,

我试图从一个文档中搜索文本,它有重复的部分,并且在文档中多次出现。但是,使用regex.match,它只显示文档中的第一个匹配项,而不显示其他匹配项

我要搜索的模式如下所示:

clauses 5.3, 12 & 15
clause 10 C, 10 CA & 10 CC
下一行显示了我正在使用的正则表达式

regex_crossref_multiple_1=r'(clause|Clause|clauses|Clauses)\s*\d+[.]?\d*\s*[a-zA-Z]*((,|&|and)\s*\d+[.]?\d*\s*[A-Z]*)+'
用于匹配的代码和结果如下所示:

cross=regex.search(regex_crossref_multiple_1,des)
(des是包含文本的字符串)

为了打印结果,我使用了
print(cross.group())

结果:

clauses 5.3, 12 & 15
然而,在des中还有其他模式,我没有得到结果

请让我知道有什么问题

可以从以下链接找到输入字符串(des)


您可以匹配
子句
,后跟可选的数字部分和可选的字符A-Z,然后使用重复模式匹配可选的逗号和数字

对于模式的最后一部分,您可以选择匹配
&
后接数字和可选字符a-Z

\b[Cc]lauses?\s+\d+(?:\.\d+)?(?:\s*[A-Z]+)?(?:,\s+\d+(?:\.\d+)?(?:\s*[A-Z]+)?)*(?:\s+(?:[,&]|and)\s+\d+(?:\.\d+)?(?:\s*[A-Z]+)?)?\b
解释

  • \b
    单词边界
  • [Cc]lauses?\s+\d+(?:\。\d+)
    匹配子句,后跟数字和可选的小数部分
  • (?:\s*[A-Z]+)?
    可以选择匹配空格字符和1+字符A-Z
  • (?:
    非捕获组
    • ,\s+\d+(?:\。\d+)
      匹配逗号、数字和可选的小数部分
    • (?:\s*[A-Z]+)?
      可以选择匹配空格字符和1+字符A-Z
  • )*
    关闭分组并重复0多次
  • (?:
    非捕获组
    • \s+(?:[,&]|和)
      匹配1+空格字符和
    • \s+\d+(?:\。\d+)
      匹配1+个空格字符,1+个数字和可选的小数部分
    • (?:\s*[A-Z]+)?
      匹配可选空格字符和1+字符A-Z
  • )?
    关闭组并将其设置为可选
  • \b
    单词边界

通过字符串扫描,查找正则表达式模式生成匹配项的第一个位置
您可以使用re.findall或re.finditer。使用re.findall,只会突出匹配的最后一部分,例如,&15'、“&10 CC”等,这就是我使用re.search的原因。我还没有试过finditer,请看一下。您可以使用re.findall,通过匹配第一部分而不匹配
&
部分来获得整个匹配,并将大写字符设置为可选。然后使用一个重复组,包括
部分
[Cc]lauses?\s+\d+(?:\。\d+)(?:\s+[a-Z]+)(?:,\s+\d+(?:\。。\d+)(?:\s+[a-Z]+)\s+(?:[,&];)和)\s+\d+(?:[a-Z]+)++
这对我来说很好……谢谢你。你能用实际的文本而不是图片来更新问题吗?如果点击有助于解决你的问题,请随意回答✓ 在这个答案的左边。请注意,接受一个解决方案会得到2。
\b[Cc]lauses?\s+\d+(?:\.\d+)?(?:\s*[A-Z]+)?(?:,\s+\d+(?:\.\d+)?(?:\s*[A-Z]+)?)*(?:\s+(?:[,&]|and)\s+\d+(?:\.\d+)?(?:\s*[A-Z]+)?)?\b