Python从积极的眼光中获得分组的价值

时间:2018-12-11 04:42:12

标签: python regex

对于以下正则表达式和输入,我能够获取group(1)匹配对象。但是如何从正面看待匹配对象呢?

regex and input

regex是:(\ w +)(?= \ s *()|(?:(?<=,|())\ s *(\ w +)\ s *(?:\ s *(\ w + )\ s *)?

输入为:PRIMARY INDEX FIRST_ONE(PLATFORM_CD,SYSTEM_NAME,DB_NAME,TABLE_NAME,COLUMN_NAME);

在这种情况下,我可以获得索引名称“ FIRST_ONE”。 我还需要获取列名。该怎么做?

我尝试获取group(2),但返回None

我尝试的代码是:

upiOrPiValue = re.search(r'(\w+)(?=\s*\()|(?:(?<=,|\())\s*(\w+)\s*(?:\s*(\w+)\s*)?',line)
                print('line : ',line)
                #print('---->',upiOrPiValue)
                if upiOrPiValue == None:
                    pass
                else:
                    PiorUpiName = upiOrPiValue.group(1)
                    print('PiorUpiName : ',PiorUpiName)
                    print('upiOrPiValue.group(2) : ',upiOrPiValue.group(2))

upiOrPiValue.group(1)返回“ FIRST_ONE”值。如何获取列名?

2 个答案:

答案 0 :(得分:1)

您的第一个语句 如何从正面看待匹配对象 ,后来的语句有点令人困惑。假设您要捕获索引名FIRST_ONE和其余列名PLATFORM_CD ,SYSTEM_NAME ,DB_NAME ,TABLE_NAME ,COLUMN_NAME,则可以简化正则表达式,并使用它来捕获所需的全部内容。

(?:\w+)(?=\s*(?:\(|,|\)))

相同的Python代码,

import re
line = 'PRIMARY INDEX FIRST_ONE ( PLATFORM_CD ,SYSTEM_NAME ,DB_NAME ,TABLE_NAME ,COLUMN_NAME );'
arr = re.findall(r'(?:\w+)(?=\s*(?:\(|,|\)))', line)
print(arr)

哪些印刷品

['FIRST_ONE', 'PLATFORM_CD', 'SYSTEM_NAME', 'DB_NAME', 'TABLE_NAME', 'COLUMN_NAME']

让我知道这是否是您想要的。否则,请更新您的帖子以阐明您的需求。

答案 1 :(得分:0)

得到正则表达式的答案:(\ w +)(?= \ s *()|(?:(?<=,|())\ s *(\ w +)\ s *(?:\ s *(\ w +)\ s *)?

# -*- coding: utf-8 -*-

import re

regex = r"(\w+)(?=\s*\()|(?:(?<=,|\())\s*(\w+)\s*(?:\s*(\w+)\s*)?"
strVal = "PRIMARY INDEX FIRST_ONE ( PLATFORM_CD ,SYSTEM_NAME ,DB_NAME ,TABLE_NAME ,COLUMN_NAME );"

matches = re.finditer(regex, strVal)

for match in matches:
    for gCount in range(1, len(match.groups())+1):
        if match.group(gCount) != None:        
            print(match.group(gCount))