捕获正则表达式中的所有匹配项(g修饰符对我不起作用)

时间:2016-08-29 17:57:27

标签: python regex

如果我想在此模式中捕获每个产品的所有最后一个术语:

PatternAnchor: Product-Computer-Keyboard, 
Product-Computer-Monitor, Product-Computer-Motherboard PatternEnd:

我试过了:

PatternAnchor: Product-(.*?)-(?P<Item>.*?)(,|PatternEnd:)

但我仍然只得到第一场比赛。

https://regex101.com/r/cR0aG8/1

3 个答案:

答案 0 :(得分:0)

如果您想在开始时将Product-开头的多个字符串与PatternAnchor:匹配,那么您可以将此PCRE正则表达式与\G

一起使用
(?:PatternAnchor: |\G\h*,\h*)Product-([^-]*)-(?P<Item>[^,\h]*)(?=,|\h*PatternEnd:)

RegEx Demo

\G在上一场比赛结束或第一场比赛的字符串开头处断言位置。

基于评论,OP似乎想要一个特定于python的正则表达式。由于\G在python正则表达式中不可用,因此可以使用:

\bProduct-([^-]*)-(?P<Item>[^,\s]*)(?=,|\s*PatternEnd:)

并单独检查以确保输入以PatternAnchor:开头。

RegEx Demo

答案 1 :(得分:0)

在Python中,您可以使用两步法:

  • 检查字符串开头是否存在PatternAnchor:(注意:如果字符串更复杂,也可以使用正则表达式执行此步骤)
  • 如果是,请使用较短的r'\bProduct-(.*?)-(?P<Item>.*?)(?:,|PatternEnd:)'模式找到所需的所有模式。

请参阅此Python demo

import re
pat = r'\bProduct-(.*?)-(?P<Item>.*?)(?:,|PatternEnd:)'
s = 'PatternAnchor: Product-Computer-Keyboard, Product-Computer-Monitor, Product-Computer-Motherboard PatternEnd:'
res = []
if (s.startswith("PatternAnchor: ")):
    res = re.findall(pat, s[15:])
print(res)

答案 2 :(得分:0)

这是你想要的吗?

https://regex101.com/r/mM1cV0/2

您的描述和代码/示例彼此之间存在很大差异。