我试图编写一个匹配两种模式的python正则表达式:
第一个是scratch_alpha
第二个是scratch_alpha1*12
(其中12可以是任何十进制数)
并且我想将*
之后的值放在变量中,如果在*
之后检测到scratch_alpha,只需在变量中写入1
我写了这个正则表达式:
([a-zA-Z0-9\_*]+)(\*\d+)?
我希望以后会得到两个小组,第一个是名字" scratch_alpha"第二个是*
或None之后的数字(如果是None,我将变量初始化为1)。
但是使用我的正则表达式,似乎第一组包含所有内容(scratch_alpha * 12)而不包含第一组中的scratch_alpha和第二组中的值。
答案 0 :(得分:4)
试试这个正则表达式:([^*]+)\*(\d+)
*
*
满足您对模式的要求
scratch_alpha
scratch_alpha1*12
*
*
之后的号码是可选的您可以尝试下面的正则表达式:
scratch_alpha(?:(?:\d+)?\*(\d+)?)?
如果捕获组为空,则*
后面没有数字,您可以用1初始化变量。
答案 1 :(得分:2)
第一组中不需要*
,
([a-zA-Z0-9\_]+)(\*\d+)?
如果您想要和之前的字符,也可以将(\*\d+)?
更改为(\*(\d+))?
分别在*
之后。
答案 2 :(得分:1)
这是因为在您的第一个括号中放置了+
,这意味着一次或多次出现最小。由于您的第二个括号有?
,因此第二个组是可选的。因此,它被省略,因为你的第一个括号可以匹配你的整个字符串,第二个括号不需要匹配任何东西。
您可以通过移除*
中的[]
来解决此问题,因此它不匹配且*
无法在您的第一个括号中匹配。所以现在你的正则表达式将是([a-zA-Z0-9\_]+)(\*\d+)?
。
希望这有帮助。