用正则表达式插入字符
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)
我们将给定的字符串分成三部分,用管道将第一部分和最后一部分分开,然后将它们连接起来。
我有一个字符串“(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)
我们将给定的字符串分成三部分,用管道将第一部分和最后一部分分开,然后将它们连接起来。