【发布时间】: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