Python正则表达式字符串扩展

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)

但这显然不起作用.

使用正则表达式有没有简单的方法呢?

Tim*_*ers 6

这是一个非常干净的方法。弄清楚它是如何工作的,你会很开心:-)

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)