2017-08-05 2 views
2

in zufälliger Reihenfolge (Python re) zeigen Ich versuche, ein Spiel von RegEx genannten Gruppen zu tun (preArgs, apm1Args, midArgs, apm2Args, postArgs) aufgeführt in der RegEx unten, die in zufälliger Reihenfolge erscheinen.
Ich bin in der Lage -Test String1, aber nicht die Test-String2 unten anzupassen:Regex (benannt) Gruppen, die

ich die folgenden Anforderungen erfüllen müssen:

kann

1. Jede der Gruppe vorhanden 1 sein oder mehr (wegen des übrig gebliebenen Mülls); oder es ist fehlt insgesamt ...

2. Jede der apm1Args und apm2args immer mit 1 oder mehr -D Schalter zusätzlich zu einzigartigen javaagent Gläser erscheinen.

ich versucht, einige OR (|) Optionen (=?) Positiven Blick in die Zukunft, aber kein Glück und in das Labyrinth zu verirren ... My Trials:

RegEx (verfügbar unter: 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>.*)$ 

-Test 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 

-Test Zeichenfolge2 (verfügbar unter: 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:

I mit einem 'Loop-over' -Methode in die Python "apmArgs Gruppe zu reinigen-up endete die Show- in zufälliger Reihenfolge oder gar nicht zeigen. Es folgt mein Code-Schnipsel (auch bei repl.it zu Test verfügbar)

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 

Ausgang:

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'] 

Antwort

0

Sie könnten ein pyparsing Ansatz finden erhalten Sie gehen schneller dann regex Gerangel.Hier ist ein Parser, der Ihre beiden Test Strings verarbeiten:

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) 

Drucke:

-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' 

Hier ist ein Beispielcode die analysierten Felder zuzugreifen:

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

druckt:

7777 
app123 
+0

Ich verwende die RegEx in WebSphere CLI (w sadmin) Jython 2.1 Umgebung; Leider ist die Pyparsen-Bibliothek nicht verfügbar und das Hinzufügen dieser zusätzlichen Bibliothek ist auf so vielen WebSphere-Knoten nicht praktikabel. – MaxGrand