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

匹配变量模式的Python正则表达式,python,regex,Python,Regex,我正在尝试编写一个匹配两种模式的python正则表达式: 第一个是scratch\u alpha 第二个是scratch_alpha1*12(其中12可以是任何十进制数) 我想把值放在变量的*后面,如果在*后面检测到scratch\u alpha,只需在变量中写1 我写了这个正则表达式: ([a-zA-Z0-9\\\\*]+)(\*\d+) 我希望后面会有两个组,第一个是名字“scratch_alpha”,第二个是*后面的数字或无(如果无,我将变量初始化为1) 但对于我的正则表达式,第一组似乎包

我正在尝试编写一个匹配两种模式的python正则表达式: 第一个是
scratch\u alpha
第二个是
scratch_alpha1*12
(其中12可以是任何十进制数) 我想把值放在变量的
*
后面,如果在
*
后面检测到scratch\u alpha,只需在变量中写1

我写了这个正则表达式:
([a-zA-Z0-9\\\\*]+)(\*\d+)

我希望后面会有两个组,第一个是名字“scratch_alpha”,第二个是
*
后面的数字或无(如果无,我将变量初始化为1)

但对于我的正则表达式,第一组似乎包含所有内容(scratch_alpha*12),而不是第一组中的scratch_alpha和第二组中的值。

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

  • 第一组:所有字符直到
    *
  • 第二组:
    *


使现代化 以满足您对模式的要求

  • scratch\u alpha
  • scratch_alpha1*12
    • *
    • *
      后面的数字是可选的
您可以尝试下面的正则表达式:

scratch\u alpha(?:(:\d+)\*(\d+)?

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

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

  • 第一组:所有字符直到
    *
  • 第二组:
    *


使现代化 以满足您对模式的要求

  • scratch\u alpha
  • scratch_alpha1*12
    • *
    • *
      后面的数字是可选的
您可以尝试下面的正则表达式:

scratch\u alpha(?:(:\d+)\*(\d+)?

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


第一组无需
*

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

如果您希望在
*
前后分别添加字符,也可以将
(\*\d+)
更改为
(\*\d+)

第一组中不需要
*

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

如果希望在
*
之前和之后分别使用字符,也可以将
(\*\d+)
更改为
(\*\d+)

发生这种情况的原因是,在第一个括号内放置了
+
,这意味着一次或多次出现的最小值。因为第二个括号中有一个
,所以第二组是可选的。因此,它被省略,因为第一个括号可以匹配整个字符串,而第二个括号不需要匹配任何内容

您可以通过从
[]
中删除
*
来克服这一问题,这样它就不匹配,并且在第一个括号中就无法匹配
*
。因此,现在您的正则表达式将是
([a-zA-Z0-9\\\\\\\+)(\*\d+)


希望这能有所帮助。

之所以会出现这种情况,是因为在第一个括号中,您添加了一个
+
,这意味着一次或多次出现的最小值。因为第二个括号中有一个
,所以第二组是可选的。因此,它被省略,因为第一个括号可以匹配整个字符串,而第二个括号不需要匹配任何内容

您可以通过从
[]
中删除
*
来克服这一问题,这样它就不匹配,并且在第一个括号中就无法匹配
*
。因此,现在您的正则表达式将是
([a-zA-Z0-9\\\\\\\+)(\*\d+)


希望这有帮助。

您应该从
[a-zA-Z..]中删除
*
您的第一个组中有一个星号您应该从
[a-zA-Z..]中删除
*
。]
您的第一组中有一个星号这是Noobscripter答案的重复。@AniMenon这解释了为什么他的原始正则表达式不匹配,以及为什么正确的正则表达式匹配。请解释当他最容易理解的解决方案是对他的
regex
修改最少的方案时,这是一种重复,并解释其区别?解释很好,你可以在另一个答案中添加相同的内容。这是Noobscripter答案的重复。@AniMenon这解释了为什么他的原始正则表达式不匹配,以及为什么更正的正则表达式匹配。请解释当他最容易理解的解决方案是对其
regex
修改最少的解决方案时,这是一种重复,并解释其差异。解释很好,您可以将其添加到其他答案中。