这个python表达式中%的含义是什么

时间:2014-10-01 17:30:15

标签: python regex

有人可以解释这个正则表达式的含义吗?我在看别人的python代码,我发现自己很好奇表达式是做什么的。我也不确定第二个百分号意味着什么。

regexStr = '(%s)' % '|'.join(['.*'.join(str(i) for i in p) for p in itertools.permutations(charList)])

2 个答案:

答案 0 :(得分:1)

所以这样做:

import itertools
charList = [1, 2, 3]

'(%s)' % '|'.join(['.*'.join(str(i) for i in p) for p in itertools.permutations(charList)])
#>>> '(1.*2.*3|1.*3.*2|2.*1.*3|2.*3.*1|3.*1.*2|3.*2.*1)'

首先它生成输入的所有排列(唯一顺序):

for permutation in itertools.permutations(charList):
    print(permutation)
#>>> (1, 2, 3)
#>>> (1, 3, 2)
#>>> (2, 1, 3)
#>>> (2, 3, 1)
#>>> (3, 1, 2)
#>>> (3, 2, 1)

对于其中每一项,它会将每个项目转换为字符串,并将其与.*

连接起来
'.*'.join(str(i) for i in (1, 2, 3))
#>>> '1.*2.*3'

然后它加入了|

的所有人
'|'.join(['.*'.join(str(i) for i in p) for p in itertools.permutations(charList)])
#>>> '1.*2.*3|1.*3.*2|2.*1.*3|2.*3.*1|3.*1.*2|3.*2.*1'

最后使用'(%s)' % resultwrap the result in brackets

'(%s)' % '|'.join(['.*'.join(str(i) for i in p) for p in itertools.permutations(charList)])
#>>> '(1.*2.*3|1.*3.*2|2.*1.*3|2.*3.*1|3.*1.*2|3.*2.*1)'

模式'1.*2.*3'匹配所有序列,例如111111222333333

模仿A|B|C|D匹配ABCD一个

因此得到的正则表达式匹配任何排列,每个项目重复任意次数(包括0)。

外括号使其成为捕获组。

答案 1 :(得分:1)

尝试使用测试字符串。我们来试试'abc'

regexStr = '(%s)' % '|'.join(['.*'.join(str(i) for i in p) for p in itertools.permutations('abc')])

>>> regexStr
'(a.*b.*c|a.*c.*b|b.*a.*c|b.*c.*a|c.*a.*b|c.*b.*a)'

因此,它会创建一个regex搜索字符串,其中每个字符都由'.*'分隔的字符串传递,每个排列由'|'分隔。

如果该行代码中的任何步骤让您感到困惑,请查看每个组件的文档

itertools.permutations
str.join
regex formatting