使用正则表达式插入char

时间:2015-01-07 08:02:37

标签: python regex

我有一个字符串'(abc)def(abc)',我想把它变成'(a | b | c)def(a | b | c)'。我可以通过以下方式做到:

    word = '(abc)def(abc)'
    pattern = ''
    while index < len(word):
        if word[index] == '(':
            pattern += word[index]
            index += 1
            while word[index+1] != ')':
                pattern += word[index]+'|'
                index += 1
            pattern += word[index]
        else:
            pattern += word[index]
        index += 1
     print pattern

但我想使用正则表达式来缩短它。你能告诉我如何插入char'|'仅通过正则表达式在括号内的字符之间?

5 个答案:

答案 0 :(得分:6)

怎么样

>>> import re
>>> re.sub(r'(?<=[a-zA-Z])(?=[a-zA-Z-][^)(]*\))', '|', '(abc)def(abc)')
'(a|b|c)def(a|b|c)'
  • (?<=[a-zA-Z])积极展望。确保要插入的位置前面有一个字母。

  • (?=[a-zA-Z-][^)(]*\))积极展望未来。确保位置后跟字母

    • [^)(]*\)确保()

    • 中的字母表
    • [^)(]*匹配()

    • 以外的任何内容
    • \)确保 () 以外的任何内容后跟)

      此部分非常重要,因为它与def部分不匹配,因为def不以)

    • 结尾

答案 1 :(得分:1)

我没有足够的声誉来评论,但你正在寻找的正则表达式将如下所示:

"(.*)"

对于您找到的每个字符串,在每对字符之间插入括号。

让我解释正则表达式的每个部分:

( - *represends the character.*

. - A dot in regex represends any possible character.

\* - In regex, this sign represends zero to infinite appearances of the previous character.

) - *represends the character.*

这样,您正在寻找带有字符的“()”外观。

希望我帮助过:)

答案 2 :(得分:1)

([^(])(?=[^(]*\))(?!\))

尝试使用\1|替换。请参阅演示。

https://regex101.com/r/sH8aR8/13

import re
p = re.compile(r'([^(])(?=[^(]*\))(?!\))')
test_str = "(abc)def(abc)"
subst = "\1|"

result = re.sub(p, subst, test_str)

答案 3 :(得分:0)

如果您的圆括号中只有单个字符,那么您可以做的就是简单地用方括号替换圆括号。因此,最初的正则表达式将如下所示:(abc)def(abc),最终的正则表达式将如下所示:[abc]def[abc]。从功能角度来看,(a|b|c)[abc]具有相同的含义。

答案 4 :(得分:0)

一个简单的Python版本来实现同样的目的。正则表达式有点难以阅读,并且通常难以调试或更改。

word = '(abc)def(abc)'
split_w = word.replace('(', ' ').replace(')', ' ').split()
split_w[0] = '|'.join( list(split_w[0]) )
split_w[2] = '|'.join( list(split_w[2]) )
print "(%s)%s(%s)" % tuple(split_w)

我们将给定的字符串分成三部分,将第一部分和最后部分分开管道并将它们连接起来。