Mar*_*edy 6 python regex string
假设我有以下字符串:
trend = '(A|B|C)_STRING'
Run Code Online (Sandbox Code Playgroud)
我想将其扩展为:
A_STRING
B_STRING
C_STRING
Run Code Online (Sandbox Code Playgroud)
OR条件可以是字符串中的任何位置.即STRING_(A|B)_STRING_(C|D)
会扩大到
STRING_A_STRING_C
STRING_B_STRING C
STRING_A_STRING_D
STRING_B_STRING_D
Run Code Online (Sandbox Code Playgroud)
我还想介绍一个空条件的情况:
(|A_)STRING 会扩大到:
A_STRING
STRING
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所尝试的:
def expandOr(trend):
parenBegin = trend.index('(') + 1
parenEnd = trend.index(')')
orExpression = trend[parenBegin:parenEnd]
originalTrend = trend[0:parenBegin - 1]
expandedOrList = []
for oe in orExpression.split("|"):
expandedOrList.append(originalTrend + oe)
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用.
使用正则表达式有没有简单的方法呢?
这是一个非常干净的方法。弄清楚它是如何工作的,你会很开心:-)
def expander(s):
import re
from itertools import product
pat = r"\(([^)]*)\)"
pieces = re.split(pat, s)
pieces = [piece.split("|") for piece in pieces]
for p in product(*pieces):
yield "".join(p)
Run Code Online (Sandbox Code Playgroud)
然后:
for s in ('(A|B|C)_STRING',
'(|A_)STRING',
'STRING_(A|B)_STRING_(C|D)'):
print s, "->"
for t in expander(s):
print " ", t
Run Code Online (Sandbox Code Playgroud)
显示:
(A|B|C)_STRING ->
A_STRING
B_STRING
C_STRING
(|A_)STRING ->
STRING
A_STRING
STRING_(A|B)_STRING_(C|D) ->
STRING_A_STRING_C
STRING_A_STRING_D
STRING_B_STRING_C
STRING_B_STRING_D
Run Code Online (Sandbox Code Playgroud)