2016-05-06 4 views
0

私はPythonの正規表現で次のように解析しようとしています。複数のPython正規表現を作成してインポートを行う方法

import (
    "github.com/user/qrt" 

    "fmt" 

    "github.com/user/zyx" 
) 

import "abcdef" 

import "abzdef" 

理想的には単一の正規表現をもたらすであろう:

単一のグループとして括弧内のすべてのものと各項目をシングルラインimport文でグループ

はここで、各import文のために私が持っているものだとして、別々に。 (..

# import (...) : r'import\s*(\()(.*?)(\))' 
# import ".." : r'import\s*(\")(.*?)(\")' 

をコロンの右側にビットを参照してください私は私が()インポートまたは「」インポートを解析したかどうかの決定処理するために最初のグループのマッチングを行うために、以下のようなものを使用することができます考えています。 ((ID)か?はい|いいえ)?試合 'はい' であれば、このようなグループ 'ID' マッチした、他に 'いいえ'

答えて

1

何か

Ideone.com

import re 

test = """import (
    "github.com/user/qrt" 

    "fmt" 

    "github.com/user/zyx" 
) 

import "abcdef" 

import "abzdef" 
""" 

rx = re.compile(r'import\s+([^(]+?$|\([^)]+\))', re.MULTILINE) 
rx2 = re.compile(r'".*"', re.MULTILINE) 

for m in rx.finditer(test): 
    imp = m.group(1) 
    if imp[0] == '(': 
     for m in rx2.finditer(imp): 
      print(m.group(0)) 
    else: 
     print(m.group(1)) 

出力リレー

"github.com/user/qrt" 
"fmt" 
"github.com/user/zyx" 
"abcdef" 
"abzdef" 

EDIT楽しみのためだけに私はモックアップ再帰下降構文解析を試みました。壊れた構文が可能です。しかし、それはアイデアであり、使いやすく、反復するだけです。

http://ideone.com/iS4aww

import re 

test = """import (
    "github.com/user/qrt" 

    "fmt" 

    "github.com/user/zyx" 
) 

import "abcdef" 

import "abzdef" 
""" 

BEGIN = 1 
IMPORT = 2 
DESCENT = 3 


class Lexer(object): 
    def __init__(self, text): 
     self._rx = re.compile(r'(import|".*?"|\(|\))') 
     self._text = text 

    def __iter__(self): 
     for m in self._rx.finditer(self._text): 
      yield m.group(1) 


class RecursiveDescent(object): 
    state = BEGIN 

    def __init__(self, lexer): 
     self._lexer = lexer 

    def __iter__(self): 
     for token in self._lexer: 
      if self.state == BEGIN: 
       if token != 'import': 
        # Beginning of the program most likely 
        raise StopIteration 
       self.state = IMPORT 
      elif self.state == IMPORT: 
       if token == '(': 
        self.state = DESCENT 
       else: 
        self.state = BEGIN 
        yield token 
      elif self.state == DESCENT: 
       if token == ')': 
        self.state = BEGIN 
       else: 
        yield token 

for path in RecursiveDescent(Lexer(test)): 
    print(path) 

出力

"github.com/user/qrt" 
"fmt" 
"github.com/user/zyx" 
"abcdef" 
"abzdef" 
+0

は、私はこれを好きですが、それが可能だ場合、単一の正規表現を期待していました。 – bdbaddog

+0

正規表現では不可能です。あなたはhttp://en.wikipedia.org/wiki/Recursive_descent_parserが必要です。これはこれが何であるかのようなものです。 http://stackoverflow.com/questions/5060659/python-regexes-how-to-access-multiple-matches-of-a-groupを確認してください。 – totoro

+0

@bdbaddog狂った編集をしました:-) – totoro

関連する問題