对于以下正则表达式和输入,我能够获取group(1)匹配对象。但是如何从正面看待匹配对象呢?
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”值。如何获取列名?
答案 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))