如何检查字符串数组中的出现

时间:2019-05-15 18:39:32

标签: python arrays

我正在做一个语义分析器,我需要知道代码中何时有函数。我知道函数以id开头,后来有一个'(' 因此,在我的元素数组中,我有这个:

Set Rng = Range("B36:B360")
For Each cll In Rng
   If cll.Row < Today And cll.Value <> "" And cll.Font.Color = vbBlack Then
If Range("B22") = "" Then
    Range("B22") = cll
Else
    Range("B23") = cll
End If

所有'id'后跟'('是函数。因此,我需要查找所有这些出现。是否有某种方法可以找到所有这些'id'和'('以便对其进行计数?

并非所有代码都完全相同,有些则更大。

我很想尝试使用if和

['id', '(', ')', '{', 'id', '(', 'lit-str', ')', ';', 'id', '(', 'lit-str', ')', ';', 'id', '(', '!', 'lit-int', ')', ';', 'id', '(', ')', ';', '}']

但这只算第一次出现。

2 个答案:

答案 0 :(得分:0)

您只需在列表中重复即可。一个更复杂的解决方案是使用正则表达式

根据问题的提出,for循环看起来是最简单的解决方案。您需要同时迭代2个元素。

在这里,一个简单的解决方案返回一个索引列表,其中元素id后跟一个以(开头的元素:

# Your input data
input_list = ['id', '(', ')', '{', 'id', '(', 'lit-str', ')', ';', 'id', '(', 'lit-str', ')',
              ';', 'id', '(', '!', 'lit-int', ')', ';', 'id', '(', ')', ';', '}']


def getFunction(input_list):
    # List that will collect the index of 'id' followed by '('
    index_list = []
    print(input_list)
    for i, mot in enumerate(input_list[:-1]):
        # Also check if input_list[i+1] is defined
        if mot == 'id' and input_list[i+1] and input_list[i+1][0] == '(':
            index_list.append(i)

    return index_list

print(getFunction(input_list))
# [0, 4, 9, 14, 20]

希望有帮助!

答案 1 :(得分:0)

如果我理解您所说的问题,我会像这样使用列表的压缩形式:https://stackoverflow.com/a/21303286/2860127

num_functions = 0
for left_token, right_token in zip(tokens, tokens[1:]):
    if left_token == "id" and right_token == "(":
        num_functions += 1
print("I found {} function calls/definitions.".format(num_functions))

尽管这取决于您如何实现语义分析器;一个更全面的系统将需要使用当前令牌中的索引,例如Alexandre B.所拥有的。

我不同意Alexandre B.和Green Cloak Guy的看法-正则表达式适用于 parser ,这是语义分析之前编译器的步骤,它可以弄清输入中的“单词”是什么(例如,将特定名称“ foo”转换为“ id”)。
另一方面,语义分析需要确保输入符合语言的语法,这是上下文无关的语法,因此我们需要比正则表达式更强的东西。递归可能是实现此目的的好方法。