Python:多种模式的匹配/替换

时间:2014-12-10 07:56:54

标签: python regex

我想在类似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)

1 个答案:

答案 0 :(得分:1)

您可以将正则表达式重写为:

r'^\s*(?:[(]\s*(?:defun|procedure)\s+|(?:defun|procedure)\s*[(]\s*)(\w+)'

然后,无论格式如何,都可以在第1组中找到该名称。