Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以随机顺序显示的正则表达式匹配(命名)组(Python re)_Python_Regex_Regex Group - Fatal编程技术网

以随机顺序显示的正则表达式匹配(命名)组(Python re)

以随机顺序显示的正则表达式匹配(命名)组(Python re),python,regex,regex-group,Python,Regex,Regex Group,我正在尝试匹配下面正则表达式中列出的正则表达式命名组(preArgs,apm1Args,midArgs,apm2Args,postArgs),它们以随机顺序出现。 我能够匹配测试字符串1,但不能匹配下面的测试字符串2: 我需要满足以下要求: 一,。 每组可能出现一个或多个(因为剩余垃圾);或者它根本不存在 二,。 每个apm1Args和apm2args除了唯一的javaagent jar之外,总是显示一个或多个-D开关 我尝试了一些或(|)选项,(?=)积极地向前看,但没有运气,迷失在迷宫中。。

我正在尝试匹配下面正则表达式中列出的正则表达式命名组(preArgsapm1ArgsmidArgsapm2ArgspostArgs),它们以随机顺序出现。
我能够匹配测试字符串1,但不能匹配下面的测试字符串2

我需要满足以下要求:

一,。 每组可能出现一个或多个(因为剩余垃圾);或者它根本不存在

二,。 每个apm1Argsapm2args除了唯一的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