对多个正则表达式模式进行优先级排序



只有在第一种模式不匹配的情况下,我才想尝试第二种模式。在这两种情况下,Match对象的使用是相同的。有什么办法可以把它缩短吗?

for line in cli.splitlines():
res = re.search('s*(.*) (.*);', line)
if res:
pairs_found[res.groups()[0]] = res.groups()[1]
else:
res = re.search('(w*) (d*) {', line)
if res:
pairs_found[res.groups()[0]] = res.groups()[1]

以下将正则表达式预编译为模式,并使用or的行为来计算第一个匹配:

pat1 = re.compile('s*(.*) (.*);')
pat2 = re.compile('(w*) (d*) {')
# or forced into one line:
# pat1, pat2 = map(re.compile, ['s*(.*) (.*);', '(w*) (d*) {'])
for line in cli.splitlines():
res = pat1.search(line) or pat2.search(line)
if res:
pairs_found[res.groups()[0]] = res.groups()[1]

在Python中>=3.8,您可以使用赋值表达式来进一步缩短它:

if res := (pat1.search(line) or pat2.search(line)):
pairs_found[res.groups()[0]] = res.groups()[1]

这有帮助吗?

for line in cli.splitlines():
res = re.search('s*(.*) (.*);', line)
if not res: res = re.search('(w*) (d*) {', line)
if res: pairs_found[res.groups()[0]] = res.groups()[1]

最新更新