Python正则表达式匹配变量模式

时间:2016-05-30 16:04:55

标签: python regex

我试图编写一个匹配两种模式的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和第二组中的值。

3 个答案:

答案 0 :(得分:4)

试试这个正则表达式:([^*]+)\*(\d+)

  • 第一组:所有字符,直到*
  • 第二组:*
  • 之后的所有数字

Regex demo 1

更新

满足您对模式的要求

  • scratch_alpha
  • scratch_alpha1*12
    • *
    • 之后捕获号码
    • *之后的号码是可选的

您可以尝试下面的正则表达式:

scratch_alpha(?:(?:\d+)?\*(\d+)?)?

如果捕获组为空,则*后面没有数字,您可以用1初始化变量。

Regex demo 2

答案 1 :(得分:2)

第一组中不需要*

([a-zA-Z0-9\_]+)(\*\d+)?

如果您想要和之前的字符,也可以将(\*\d+)?更改为(\*(\d+))?分别在*之后。

答案 2 :(得分:1)

这是因为在您的第一个括号中放置了+,这意味着一次或多次出现最小。由于您的第二个括号有?,因此第二个组是可选的。因此,它被省略,因为你的第一个括号可以匹配你的整个字符串,第二个括号不需要匹配任何东西。

您可以通过移除*中的[]来解决此问题,因此它不匹配且*无法在您的第一个括号中匹配。所以现在你的正则表达式将是([a-zA-Z0-9\_]+)(\*\d+)?

希望这有帮助。