2016-11-26 25 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