2017-08-05 30 views
2

我试图做一个匹配的正则表达式命名的组(preArgsapm1ArgsmidArgsapm2ArgspostArgs)列在下面的regEx中,以随机顺序出现。
我能够匹配测试字符串1,但不是测试String2的下面:正则表达式匹配,在随机顺序显示出来(命名)组(Python的重新)

我需要满足下列要求:

1. 该组的每个可以是本1或更多(因为剩下的垃圾);或者它缺席共...

2. 每个apm1Argsapm2args的始终,除了独特的javaagent罐1个或多个-D开关出现。

我尝试了一些OR(|)选项,(=?)积极向前看,但没有运气,并在迷宫中迷路...... 我的考验:

正则表达式(网址为:RegEx listed at regex101.com

^(?P<preArgs>.*)(?P<apm1Args>-javaagent:.+\/agent1\.jar\s+(?:-Dvendor1\.agent1\.\S+\s*)*)(?P<midArgs>.*)(?P<apm2Args>-javaagent:.+\/agent2\.jar\s+(?:-Dvendor2\.agent2\.\S+\s*)*)(?P<postArgs>.*)$ 

测试String1中

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/path2/to/profiles/agent2.profile -Dvendor2.agent2.customValue1=myValue2 

测试String2的(网址为:same RegEx with a different regex101.com link

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/path2/to/profiles/agent2.profile -Dvendor2.agent2.customValue1=myValue2 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon 

UPDATE:

我结束了在Python清理 'apmArgs' 组显示 - 一个 '环比' 的方法随机顺序或根本不显示。以下是我的代码片段(也在repl.it提供给测试)

import os, sys, re 

regExArr=[ 
    '(?P<preArgs>.*)(?P<apmArgs>-javaagent:\s*\/\S+agent1\.jar\s+(?:-Dvendor1\.agent1\.\S+\s*)*)(?P<postArgs>.*)' 
,'(?P<preArgs>.*)(?P<apmArgs>-javaagent:\s*\/\S+agent2\.jar\s+(?:-Dvendor2\.agent2\.\S+\s*)*)(?P<postArgs>.*)' 
] 

testStrList=[ 
    '-javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/path2/to/profiles/agent2.profile -Dvendor2.agent2.customValue1=myValue2' 
,'-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1' 
,'-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/metlife/runtime/installed/apm/profiles/csa.profile -Dvendor2.agent2.customValue1=myValue2 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName= -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon' 
,'-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -Xgcpolicy:gencon' 
] 

newApmArgs='-javaagent:/path3/to/agent3.jar -Dvendor3.agent3.applicationName=app1234 -Dvendor3.agent3.tierName=myTier13 -Dvendor3.agent3.nodeName=myNode13 -Dvendor3.agent3.uniqueHostId=myHost13' 

for i, testStr in enumerate(testStrList): 

    for regEx in regExArr: 

     matchedArgs = re.search(regEx,testStr) 

     while matchedArgs: 

      print "matchedArgs found count:", len(matchedArgs.groups()) 
      print "matchedArgs found:\n", matchedArgs.groups() 
      #ignore any <apmArgs> group and concatenate other groups 
      testStr=(matchedArgs.group('preArgs').strip()+' '+matchedArgs.group('postArgs').strip()).strip() 
      #check further for leftover <apmArgs> and repeat the clean-up 
      matchedArgs = re.search(regEx,testStr) 

    testStrList[i] = testStr + ' ' + newApmArgs 

print "cleaned up list testStrList that had Random groups of APM Args Text (now appended with 3rd type APM Args) is:\n", testStrList 

输出:

matchedArgs found count: 3 
matchedArgs found: 
('-javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1 ', '-javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1 ', '-Xgcpolicy:gencon -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/path2/to/profiles/agent2.profile -Dvendor2.agent2.customValue1=myValue2') 
matchedArgs found count: 3 
matchedArgs found: 
('', '-javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1 ', '-Xgcpolicy:gencon -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/path2/to/profiles/agent2.profile -Dvendor2.agent2.customValue1=myValue2') 
matchedArgs found count: 3 
matchedArgs found: 
('-Xgcpolicy:gencon ', '-javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/path2/to/profiles/agent2.profile -Dvendor2.agent2.customValue1=myValue2', '') 
matchedArgs found count: 3 
matchedArgs found: 
('-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 ', '-javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName=myNode1 -Dvendor1.agent1.uniqueHostId=myHost1', '') 
matchedArgs found count: 3 
matchedArgs found: 
('-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/metlife/runtime/installed/apm/profiles/csa.profile -Dvendor2.agent2.customValue1=myValue2 ', '-javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName= -Dvendor1.agent1.uniqueHostId=myHost1 ', '-Xgcpolicy:gencon') 
matchedArgs found count: 3 
matchedArgs found: 
('-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 ', '-javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/metlife/runtime/installed/apm/profiles/csa.profile -Dvendor2.agent2.customValue1=myValue2 ', '-Xgcpolicy:gencon') 
cleaned up list testStrList that had Random groups of APM Args Text (now appended with 3rd type APM Args) is: 
['-Xgcpolicy:gencon -javaagent:/path3/to/agent3.jar -Dvendor3.agent3.applicationName=app1234 -Dvendor3.agent3.tierName=myTier13 -Dvendor3.agent3.nodeName=myNode13 -Dvendor3.agent3.uniqueHostId=myHost13', '-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path3/to/agent3.jar -Dvendor3.agent3.applicationName=app1234 -Dvendor3.agent3.tierName=myTier13 -Dvendor3.agent3.nodeName=myNode13 -Dvendor3.agent3.uniqueHostId=myHost13', '-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -Xgcpolicy:gencon -javaagent:/path3/to/agent3.jar -Dvendor3.agent3.applicationName=app1234 -Dvendor3.agent3.tierName=myTier13 -Dvendor3.agent3.nodeName=myNode13 -Dvendor3.agent3.uniqueHostId=myHost13', '-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -Xgcpolicy:gencon -javaagent:/path3/to/agent3.jar -Dvendor3.agent3.applicationName=app1234 -Dvendor3.agent3.tierName=myTier13 -Dvendor3.agent3.nodeName=myNode13 -Dvendor3.agent3.uniqueHostId=myHost13'] 

回答

0

您可能会发现一个pyparsing方法将让你去越快,正则表达式的争吵。这里是将处理您的两个测试字符串解析器:

import pyparsing as pp 

# just some punctuation 
COLON,EQ = map(pp.Suppress, ':=') 

# expressions for key=value,... switches 
subkey = pp.Word(pp.alphas) 
subvalue = pp.pyparsing_common.integer | pp.Word(pp.printables, excludeChars=',') 
key_value_list = pp.Dict(pp.delimitedList(pp.Group(subkey + EQ + subvalue))) 

# parse switches 
switch_key = pp.Word('-', pp.alphas).setParseAction(lambda t: t[0][1:].lower()) 
switch_value = key_value_list | subvalue 
switch = switch_key + pp.Optional(COLON + switch_value) 

# -D definitions 
java_path_name = pp.delimitedList(pp.pyparsing_common.identifier, delim='.', combine=True) 
defn = (pp.Suppress("-D") + java_path_name.leaveWhitespace() 
     + EQ.leaveWhitespace() 
     + pp.Optional(subvalue().leaveWhitespace())) 

# define parser for the entire line - use Dict class to define dynamic key-value structures instead of just 2-tuples 
parser = pp.Dict(pp.OneOrMore(pp.Group(defn | switch))) 

tests = """\ 
-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName= -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/metlife/runtime/installed/apm/profiles/csa.profile -Dvendor2.agent2.customValue1=myValue2 
-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/metlife/runtime/installed/apm/profiles/csa.profile -Dvendor2.agent2.customValue1=myValue2 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName= -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon 
""" 
parser.runTests(tests) 

打印:

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName= -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/metlife/runtime/installed/apm/profiles/csa.profile -Dvendor2.agent2.customValue1=myValue2 
[['xdebug'], ['xnoagent'], ['xrunjdwp', ['transport', 'dt_socket'], ['server', 'y'], ['suspend', 'y'], ['address', 7777]], ['javaagent', '/path1/to/agent1.jar'], ['vendor1.agent1.applicationName', 'app123'], ['vendor1.agent1.tierName', 'myTier1'], ['vendor1.agent1.nodeName'], ['vendor1.agent1.uniqueHostId', 'myHost1'], ['xgcpolicy', 'gencon'], ['javaagent', '/path2/to/vendor2/agent2.jar'], ['vendor2.agent2.agentProfile', '/metlife/runtime/installed/apm/profiles/csa.profile'], ['vendor2.agent2.customValue1', 'myValue2']] 
- javaagent: '/path2/to/vendor2/agent2.jar' 
- vendor1.agent1.applicationName: 'app123' 
- vendor1.agent1.nodeName: '' 
- vendor1.agent1.tierName: 'myTier1' 
- vendor1.agent1.uniqueHostId: 'myHost1' 
- vendor2.agent2.agentProfile: '/metlife/runtime/installed/apm/profiles/csa.profile' 
- vendor2.agent2.customValue1: 'myValue2' 
- xdebug: '' 
- xgcpolicy: 'gencon' 
- xnoagent: '' 
- xrunjdwp: [['transport', 'dt_socket'], ['server', 'y'], ['suspend', 'y'], ['address', 7777]] 
    - address: 7777 
    - server: 'y' 
    - suspend: 'y' 
    - transport: 'dt_socket' 


-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=7777 -javaagent:/path2/to/vendor2/agent2.jar -Dvendor2.agent2.agentProfile=/metlife/runtime/installed/apm/profiles/csa.profile -Dvendor2.agent2.customValue1=myValue2 -javaagent:/path1/to/agent1.jar -Dvendor1.agent1.applicationName=app123 -Dvendor1.agent1.tierName=myTier1 -Dvendor1.agent1.nodeName= -Dvendor1.agent1.uniqueHostId=myHost1 -Xgcpolicy:gencon 
[['xdebug'], ['xnoagent'], ['xrunjdwp', ['transport', 'dt_socket'], ['server', 'y'], ['suspend', 'y'], ['address', 7777]], ['javaagent', '/path2/to/vendor2/agent2.jar'], ['vendor2.agent2.agentProfile', '/metlife/runtime/installed/apm/profiles/csa.profile'], ['vendor2.agent2.customValue1', 'myValue2'], ['javaagent', '/path1/to/agent1.jar'], ['vendor1.agent1.applicationName', 'app123'], ['vendor1.agent1.tierName', 'myTier1'], ['vendor1.agent1.nodeName'], ['vendor1.agent1.uniqueHostId', 'myHost1'], ['xgcpolicy', 'gencon']] 
- javaagent: '/path1/to/agent1.jar' 
- vendor1.agent1.applicationName: 'app123' 
- vendor1.agent1.nodeName: '' 
- vendor1.agent1.tierName: 'myTier1' 
- vendor1.agent1.uniqueHostId: 'myHost1' 
- vendor2.agent2.agentProfile: '/metlife/runtime/installed/apm/profiles/csa.profile' 
- vendor2.agent2.customValue1: 'myValue2' 
- xdebug: '' 
- xgcpolicy: 'gencon' 
- xnoagent: '' 
- xrunjdwp: [['transport', 'dt_socket'], ['server', 'y'], ['suspend', 'y'], ['address', 7777]] 
    - address: 7777 
    - server: 'y' 
    - suspend: 'y' 
    - transport: 'dt_socket' 

下面是一些示例代码来访问解析字段:

t0 = tests.splitlines()[0] 
result = parser.parseString(t0) 
print(result.xrunjdwp.address) 
print(result['vendor1.agent1.applicationName']) 

打印:

7777 
app123 
+0

我在WebSphere CLI中使用RegEx(w sadmin)Jython 2.1环境;不幸的是,pyparsing lib不可用,添加这个额外的库在许多WebSphere节点上不实用。 – MaxGrand