2016-11-26 73 views
3

我试图使用正则表达式与模式

匹配以下字符串中的图案重复的正则表达式

字符串:

These are my variables -abc $def -geh $ijk for case1 

These are my variables -lmn $opq -rst $uvw for case2 

模式:

These\s+are\s+my\s+variables(?:\s*-(\w+)\s+\$(\w+))*\s+for\s+(case\d) 

我能成功匹配上面的字符串与我的模式,但问题是,我无法按照我的意图赶上小组。我尝试给我的结果如下

geh, ijk, case1 

rst, uvw, case2 

我想要的群体输出如下

abc, def, geh, ijk, case1 

lmn, opq, rst, uvw, case2 

如何为这个问题进场?

Regex Demo

+0

不要为第一组使用'?:',因为这是不匹配的组。 –

+0

使用PyPi正则表达式并使用相同的模式 - 您将获得'.captures(1)'和'.captures(2)'中的变量。 –

+0

重复捕获组时,只有最后一次迭代存储在结果匹配中。如果它总是四次,请展开您的模式 - 否则您需要两步解决方案。 –

回答

1

使用PyPi regex module并使用你正在使用如下面所示的相同的正则表达式:

import regex 
s = 'These are my variables -abc $def -geh $ijk for case1' 
rx = regex.compile(r'These\s+are\s+my\s+variables(?:\s*-(\w+)\s+\$(\w+))*\s+for\s+(case\d)') 
print([x.captures(1) for x in rx.finditer(s)]) 
# => [abc, geh] 
print([x.captures(2) for x in rx.finditer(s)]) 
# => [def, ijk] 

否则,捕获所有与

These\s+are\s+my\s+variables((?:\s*-\w+\s+\$\w+)*)\s+for\s+(case\d) 

的选项(参见demo)并获得单独的值作为步骤2.

import re 
r = r"These\s+are\s+my\s+variables((?:\s*-\w+\s+\$\w+)*)\s+for\s+(case\d)" 
s = "These are my variables -abc $def -geh $ijk for case1" 
m = re.search(r, s) 
if m: 
    print(re.findall(r'-(\w+)', m.group(1))) 
    print(re.findall(r'\$(\w+)', m.group(1))) 
    print(m.group(2)) 

参见Python demo

+0

谢谢@Wiktor。希望这对我的场景有所帮助 – newbie

+0

我也加了're'解决方案。 –

+0

是的,我也已经实现了使用这两步抽取变量的过程。感谢您的解决方案:) – newbie

1

考虑使用str.lstripstr.split功能的以下可供选择的方法(它会返回的参数集列表对于每个行):

s = '''These are my variables -abc $def -geh $ijk for case1 

These are my variables -lmn $opq -rst $uvw for case2''' 

params = [[p.lstrip('$-') for p in l.split()[4:] if p != 'for'] for l in s.split('\n') if l] 

print(params) 

输出:

[['abc', 'def', 'geh', 'ijk', 'case1'], ['lmn', 'opq', 'rst', 'uvw', 'case2']] 
+0

这个解决方案看起来不错,但我想实施我的方案使用正则表达式。感谢实施的新理念! – newbie