我想在类似LISP的代码中匹配函数定义。该功能可以用4种格式定义
1. procedure(functionName(argList) mainCode)
2. (procedure functionName (argList) mainCode)
3. defun(functionName(argList) mainCode)
4. (defun functionName (argList) mainCode)
我使用下面的代码使用 re.search 来匹配上述可能性。这很好用。但是,当我使用 match.group(1)捕获匹配时,这仅在匹配发生在第一个模式时才有效。
问题:如何捕获所有4种可能性?
#!/usr/bin/python -tt
import os
import re # Import regular expression module
import sys
# traverse root directory, and list directories as dirs and files as files
def GetFunctionsFromSkillFile(skillFile):
with open(skillFile) as f:
data = f.readlines()
for line in data:
# Match Procedure
match=re.search(r'^\s*procedure\(\s*(\w+)|^\s*\(\s*procedure\s+(\w+)|^\s*defun\(\s*(\w+)|^\s*\(\s*defun\s+(\w+)', line)
if match:
# Capture the match
print('{0}.autoload="{1}"'.format(match.group(1), os.path.basename(skillFile)))
# Python boiler plate call.
if __name__ == "__main__":
# Quick check on arguments
if len (sys.argv) < 2:
print ('Usage: CreateAutoloadsFile.py skillDirectory')
sys.exit(2)
# Get the Excel file from cmd line arguments
skillDir = sys.argv[1]
# Traverse
for root, dirs, files in os.walk(skillDir):
for file in sorted(files):
if re.search(r'.il$', file):
#print(file)
file = root + "/" + file
GetFunctionsFromSkillFile(file)
答案 0 :(得分:1)
您可以将正则表达式重写为:
r'^\s*(?:[(]\s*(?:defun|procedure)\s+|(?:defun|procedure)\s*[(]\s*)(\w+)'
然后,无论格式如何,都可以在第1组中找到该名称。