以随机顺序显示的正则表达式匹配(命名)组(Python re)
我正在尝试匹配下面正则表达式中列出的正则表达式命名组(preArgs,apm1Args,midArgs,apm2Args,postArgs),它们以随机顺序出现。以随机顺序显示的正则表达式匹配(命名)组(Python re),python,regex,regex-group,Python,Regex,Regex Group,我正在尝试匹配下面正则表达式中列出的正则表达式命名组(preArgs,apm1Args,midArgs,apm2Args,postArgs),它们以随机顺序出现。 我能够匹配测试字符串1,但不能匹配下面的测试字符串2: 我需要满足以下要求: 一,。 每组可能出现一个或多个(因为剩余垃圾);或者它根本不存在 二,。 每个apm1Args和apm2args除了唯一的javaagent jar之外,总是显示一个或多个-D开关 我尝试了一些或(|)选项,(?=)积极地向前看,但没有运气,迷失在迷宫中。。
我能够匹配测试字符串1,但不能匹配下面的测试字符串2: 我需要满足以下要求: 一,。 每组可能出现一个或多个(因为剩余垃圾);或者它根本不存在 二,。 每个apm1Args和apm2args除了唯一的javaagent jar之外,总是显示一个或多个-D开关 我尝试了一些或(|)选项,(?=)积极地向前看,但没有运气,迷失在迷宫中。。。 我的审判: RegEx(可从以下网址获得) 测试字符串2(可从以下网址获得) 更新:
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']
最后,我在python中使用了一个“loop-over”方法来清理以随机顺序显示或根本不显示的“apmArgs”组。以下是我的代码片段(也可在上进行测试)
您可能会发现pyparsing方法比regex争论更快。下面是一个解析器,它将处理您的两个测试字符串:
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
我在WebSphereCLI(wsadmin)Jython2.1环境中使用正则表达式;不幸的是,pyparsing库不可用,并且在这么多WebSphere节点上添加这个附加库是不实际的。
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