有人可以解释这个正则表达式的含义吗?我在看别人的python代码,我发现自己很好奇表达式是做什么的。我也不确定第二个百分号意味着什么。
regexStr = '(%s)' % '|'.join(['.*'.join(str(i) for i in p) for p in itertools.permutations(charList)])
答案 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)' % result
到wrap 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
匹配A
,B
,C
或D
的一个。
因此得到的正则表达式匹配任何排列,每个项目重复任意次数(包括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
搜索字符串,其中每个字符都由'.*'
分隔的字符串传递,每个排列由'|'
分隔。
如果该行代码中的任何步骤让您感到困惑,请查看每个组件的文档