【问题标题】:Regex extract group inside optional group可选组内的正则表达式提取组
【发布时间】:2021-11-05 03:27:28
【问题描述】:

我有“identfier STEP=10”形式的字符串,其中“STEP=10”部分是可选的。目标是检测有或没有 STEP 部分的两条线,并在它是线的一部分的情况下提取 STEP 的数值。现在匹配这两种情况很容易,

import re
pattern = ".*(STEP=[0-9]+)?"
re.match(pattern, "identifier STEP=10")
re.match(pattern, "identifier")

这可以毫无问题地检测这两种情况。但是我没能一口气提取出数值。我尝试了以下,

import re
pattern = ".*(STEP=([0-9]+))?"
group0 = re.search(pattern, "identifier STEP=10").groups()
group1 = re.search(pattern, "identifier").groups()

虽然它仍然检测到线条,但我只得到

group0 = (None, None)
group1 = (None, None)

虽然我希望得到类似的东西

group0 = (None, "10")
group1 = (None, None)

正则表达式不适合一次性执行此操作还是我只是使用错误?我很好奇是否有一个正则表达式调用在匹配该行后返回我想要的内容而无需进行第二次传递。

【问题讨论】:

  • 试试pattern = "^.*?(STEP=([0-9]+))?$"。但是你会得到('STEP=10', '10')。为什么不只是re.search(r'STEP=(\d+)', text) BTW?您会得到一个匹配项,然后match.group(1) 将保留该号码,或者没有匹配项。你真的需要这两个组吗?
  • 您能解释一下为什么您的pattern = "^.*?(STEP=([0-9]+))?$" 有效,但我的模式无效吗?这对我来说是一个可以接受的答案。我主要是想更好地理解正则表达式。问题本身是次要的。 re.search(r'STEP=(\d+)', text) 不匹配这两种情况,除非我弄错了,否则对于不包含 STEP 部分的行会产生 None 。我也不需要两个组,但我想匹配带有和不带有 STEP 部分的行,并在包含 STEP 的情况下一次性获取值。

标签: python regex regex-group


【解决方案1】:

可能的解决方案如下所示

import re
pattern = "^.*?(?:STEP=([0-9]+))?$"
group0 = re.search(pattern, "identifier STEP=10").groups()
group1 = re.search(pattern, "identifier").groups()
print(*group0)
print(*group1)

请参阅Python demo

^.*?(?:STEP=([0-9]+))?$ 正则表达式匹配

  • ^ - 字符串开头
  • .*? - 除换行符之外的零个或多个字符尽可能少(即正则表达式引擎首先跳过此模式并尝试后续模式,并且仅在后续模式无法匹配时才返回使用此模式)
  • (?:STEP=([0-9]+))? - 一个可选的非捕获组:STEP= 然后第 1 组捕获一个或多个 ASCII 数字
  • $ - 字符串结束。

.*(STEP=[0-9]+)? 正则表达式匹配如下:

  • .* - 从头到尾抓取整条线
  • (STEP=[0-9]+)? - 该组用* 量化(表示量化模式的零次或多次次出现),因此正则表达式引擎,其索引现在位于行尾,找到一个match:字符串末尾的空字符串,返回匹配,第1组文本值为空。

为了能够解决此类问题,您必须了解正则表达式中的回溯(例如,请参阅this YT video of mine 了解更多信息)。

【讨论】:

  • 感谢您的全面回答。所以我的问题是由于使用.* 而没有限制它,如果我理解正确的话。
  • @HansWurst 不仅如此。锚点也起着重要的作用,尤其是$,因为它使.*? 扩展到字符串的末尾。如果您预期的匹配是字符串的一部分,则解决方案会有所不同。
猜你喜欢
  • 2010-11-04
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多