我有一个字符串'(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'|'仅通过正则表达式在括号内的字符之间?
答案 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)
我们将给定的字符串分成三部分,将第一部分和最后部分分开管道并将它们连接起来。