在我的Python应用程序中,我需要编写一个与以分号()终止的C ++ for
或while
循环匹配的正则表达式;。例如,它应与此匹配:
for (int i = 0; i < 10; i++);
…但是不是这个:
for (int i = 0; i < 10; i++)
乍一看,这似乎很琐碎,直到你意识到左括号和右括号之间的文本可能包含其他括号,例如:
for (int i = funcA(); i < funcB(); i++);
我正在使用python.re模块。现在,我的正则表达式如下所示(我留了我的评论,以便你可以更轻松地理解它):
# match any line that begins with a "for" or "while" statement:
^\s*(for|while)\s*
\( # match the initial opening parenthesis
# Now make a named group 'balanced' which matches a balanced substring.
(?P<balanced>
# A balanced substring is either something that is not a parenthesis:
[^()]
| # …or a parenthesised string:
\( # A parenthesised string begins with an opening parenthesis
(?P=balanced)* # …followed by a sequence of balanced substrings
\) # …and ends with a closing parenthesis
)* # Look for a sequence of balanced substrings
\) # Finally, the outer closing parenthesis.
# must end with a semi-colon to match:
\s*;\s*
这对于上述所有情况都非常适用,但是一旦你尝试使for循环的第三部分包含一个函数,它就会中断,如下所示:
for (int i = 0; i < 10; doSomethingTo(i));
我认为这是有问题的,因为只要你在开始和结束括号之间放置一些文本,“平衡”组就会匹配包含该文本的文本,因此该(?P=balanced)
部分不再起作用,因为它不匹配(由于事实括号内的文本是不同的)。
在我的Python代码中,我使用VERBOSE和MULTILINE标志,并创建正则表达式,如下所示:
REGEX_STR = r"""# match any line that begins with a "for" or "while" statement:
^\s*(for|while)\s*
\( # match the initial opening parenthesis
# Now make a named group 'balanced' which matches
# a balanced substring.
(?P<balanced>
# A balanced substring is either something that is not a parenthesis:
[^()]
| # …or a parenthesised string:
\( # A parenthesised string begins with an opening parenthesis
(?P=balanced)* # …followed by a sequence of balanced substrings
\) # …and ends with a closing parenthesis
)* # Look for a sequence of balanced substrings
\) # Finally, the outer closing parenthesis.
# must end with a semi-colon to match:
\s*;\s*"""
REGEX_OBJ = re.compile(REGEX_STR, re.MULTILINE| re.VERBOSE)
有人可以建议对此正则表达式进行改进吗?对于我来说,变得太复杂了以至于无法理解。
你可以编写一个非常简单的例程来执行此操作,而无需使用正则表达式:
pos
,使其指向你for
或之后的左方括号while
。openBr
为0。pos
,读取各个位置的字符,并openBr
在看到方括号时增加,而在看到方括号时减少。这将在开始一次增加它,在“第一左括号for
(”,递增和递减多一些对之间的一些支架,并将其设置回0
当你for
托架关闭。openBr
是0一次。停止位置是的右括号for(...)
。现在,你可以检查后面是否有分号。
问题内容: 我很好奇:这两个循环实现之间在速度和性能上是否有所不同?假定 size() 方法返回处理一组元素的数组,集合或对象的长度(实际上是来自 XOM api)。 实施1: 实施2: 问题答案: 从性能的角度来看,没有什么区别。这是因为可以优化循环,以便内联size()查找,从而导致很小的性能差异。 主要区别在于循环时大小是否改变。第一种情况将尝试迭代固定次数。在第二种情况下,迭代次数将取决于
问题内容: 我正在使用Django的URLconf,我将收到的URL是 我想使用来匹配该URL ,但它不起作用。 然后我发现这是“?”的问题。 因为我尝试使用even 进行匹配,但都失败了,但是当它是“ +”或任何其他字符时,它可以工作。 如何匹配“?”,有什么特别之处吗? 问题答案: 你的网址内部不匹配的原因是因为?开始新的GET查询。 因此,URL的可匹配部分只能达到第一个“ aaa”。其余的
问题内容: 我正在解析(种类)表格的名称: 通常有两个项(二项式),但有时有3个或更多。 我写 大部分时间都有效,但偶尔会陷入无限循环。花了一些时间来查找正则表达式匹配中的内容,然后我才意识到这是一个错字,我应该写 正确执行。 我的问题是: 为什么会发生这种循环? 有没有办法在运行程序之前检查类似的正则表达式错误?否则,可能很难在prgram分发之前就将它们捕获并引起问题。 [注意:我不需要物种的
我有一个字符串,其中有多个逗号和空格作为单词之间的分隔符。以下是一些示例: 我想使用正则表达式将上述3个示例中的任何一个转换为“word1, word2, word3”-(注意:结果中最后一个单词后没有逗号)。 我使用了以下代码: 我得到的输出是“word1,word2,word3,”。而实际上我想要“word1,word2,word3”。单词3后没有逗号。 我应该使用什么样的正则表达式和re方法
问题内容: 在我的一个项目中,我不得不处理逗号分隔文件(CSV)。我必须基于逗号来拆分数据,而忽略引号内的逗号(即),因此我使用了另一个堆栈溢出问题(Java:拆分逗号分隔的字符串但忽略了引号中的逗号)中提到的表达式。一切工作都很好,直到最近我才注意到它不适用于下面提到的一种特定情况。 我需要在逗号上拆分的数据字符串为: 以我的理解为基础 拆分后的数据应返回一个大小为10的数组,该数组的后两个索引
出于某种原因,上面的正则表达式没有捕捉带撇号的名称。 例如:D'STALL先生不匹配。任何关于regex模式的帮助都将不胜感激。 代码所做的是获取输入并用XML标记它。诸如以下内容: 正则表达式与上述段落不匹配。