在模式中使用模式重复的正则表达式

时间:2016-11-26 21:08:12

标签: python regex

我正在尝试使用正则表达式匹配以下字符串

字符串:

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

2 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分: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']]