用正则表达式插入字符

insert char with regular expression

我有一个字符串“(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

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

怎么样

>>> 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 不以 )

    • 结尾

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

"(.*)"

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

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

( - *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.*

通过这种方式,您可以查找“()”之间带有字符的任何外观。

希望我有所帮助:)

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

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

尝试 this.Replace 和 |。查看演示。

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

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

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

一个简单的 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)

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