0

我对正则表达式非常非常陌生。我大约 3 小时前才拿起它,但我碰到了一个障碍,我似乎无法动摇它。所以,和往常一样,我求助于互联网来解决我所有的问题,当它无法向我解释答案时,我在 stackoverflow 上搜索,看看是否有人问过我的问题,最后刚刚发布了一个新问题我无法通过浏览自己回答。

我会稍微简化一下我正在尝试做的事情,因为我已经弄清楚了其中的大部分内容,但是其中的一小部分并没有按照我想要的方式工作,或者实际上根本没有,整个混乱是复杂且难以解释的,但最后,我有一大堆字符串我想运行一个正则表达式。

因此,在重复循环中,我传递了一个包含变量名的字符串。现在,我很难解释变量可能是什么样子,所以我只是列出示例,然后是一个管道,然后是我想要提取的内容。

Variable | (Variable)
Variable.list[3]name | (Variable.list[3]name)
Var.list[5] | (Var.list , 5)
Var.list_name[3]thing_words[4][3][2] | (Var.list_name[3]thing_words , 4 , 3 , 2)
Var[3] | (Var , 3)
Var.word | (Var.word)

等等。我认为这很清楚,对吧?我想要变量名称,它可能包含也可能不包含括号,如果有任何尾括号,我想将它们从名称中排除并捕获它们,以便我可以从 match.groups() 访问它们。我认为没有任何变量的名称以 ...[] 结尾,但内部没有数字,但可能有,如果有,我也想忽略它们。

现在我正在尝试做类似的事情:

for line in list:
regex = re.compile("^[-\w\[\]\.]+(\[(0-9)*]\])*$")
match = regex.match(line)
if match:
do something that depends on len( match.groups() )

但是......它不起作用。正则表达式从不匹配,即使我认为它应该匹配。

在我心里,我说得很清楚!我希望它以一堆东西开头,并可能以一堆括号内的数字结尾,如果它以括号内的数字结尾,则捕获并存储它们,但忽略任何不在字符串末尾的括号内的数字。

所以......现在我已经彻底解释了自己,以至于有点多余......我该怎么做才能让它按我想要的方式工作?甚至可以按照我尝试的方式完成吗?我是否应该做更多类似的事情:

while (match.endswith("]")
match.strip("]")
func()
match.strip("[")

func() 在哪里做一个正则表达式来去掉末尾的数字?这似乎过于复杂,而且非常混乱。我的直觉告诉我正则表达式可以处理它,而我的新手眼睛就是看不到如何处理。

4

2 回答 2

1

这个问题比我意识到的要复杂一些,因为该re模块不允许您重复捕获组,因此您必须做一些手动工作来区分。首先,使用一个正则表达式在正确的位置划分字符串;然后用另一个找到所有的数字。

def get_variable_and_sizes(var_string):
    result = re.search(r'(.*?)((?:\[\d*])*)$', var_string)
    var_name = result.group(1)
    numbers = re.findall(r'\[(\d+)]', result.group(2))
    return [var_name] + numbers

我们在这里所做的是将问题分为两部分。第一个正则表达式有两个捕获组:第一个捕获任意数量的字符(非贪婪),第二个捕获任意数量的括号数字重复,作为一个单元(如上所述,我们不能重复捕获组,但是我们可以在捕获组内重复组)。

我们得到的匹配中的第一组是变量名。第二组需要进一步解析以识别其中的所有数字。幸运的是,编写一个捕获括号内的数字的正则表达式很容易,然后用于findall获取第二组中所有匹配项的列表。如果没有这样的匹配,我们会得到一个空列表。

最后,我们创建一个包含变量名称的列表,连接我们从第二个正则表达式返回的列表,然后返回它。

于 2013-08-07T00:52:09.587 回答
1

我认为您不能拥有可变数量的捕获组。如果这样做,则只会捕获最后一个捕获组的值。一种解决方法是,如果您知道最后将拥有的最大方括号数。在这种情况下,您可以简单地将正则表达式中的代码重复该次数:

^[a-zA-Z\.]+(?:\[\d\][a-zA-Z\.]+)*(?:\[(\d)\])?(?:\[(\d)\])?(?:\[(\d)\])?(?:\[(\d)\])?$

此正则表达式将在字符串末尾捕获多达 4 个方括号组。

除此之外。我认为解析器将是您的最佳选择。

于 2013-08-07T01:09:10.317 回答