我正在尝试使用正则表达式匹配以下字符串
字符串:
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
如何处理此问题?
答案 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.lstrip
和str.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']]