在python中使用正则表达式时,我遇到了一个场景。 我想要做的是如果一个字符串有运算符,我想在运算符之前和之后添加空格。
s = 'H>=ll<=o=wo+rl-d.my name!'
op = 'H >= ll <= o = wo + rl - d.my name!'
似乎很直接,所以我想出了以下表达式:
re.sub(r'((<=)|(>=)|[+-=*/])+',' \\1 ',r'H>=ll<=o=wo+rl-d.myname!')
但我得到的结果是:
'H >= ll <= o = wo + rl - d . my name!'
它在遇到每个点(。)之后添加了一个空格,即使我在我的正则表达式中没有提到它。
我正在使用python 2.7,如果你能对此有所了解,我将非常感激。
答案 0 :(得分:7)
点周围空格的原因是-
。具体是[+-=]
,这是一个字符类,其中包含从+
到=
的字符,其中包含.
。
为避免这种情况,您必须使用-
转义\-
,例如
re.sub(r'((<=)|(>=)|[+\-=*/])+',' \\1 ',r'H>=ll<=o=wo+rl-d.myname!')
如@LaurentLAPORTE所述,您还可以将-
放在字符类的开头或结尾,例如[-+=*/]
或[+=*/-]
都可以解决问题。
答案 1 :(得分:4)
所以当你做一个像:
这样的角色类时[+-=]
正则表达式将其视为+
(ASCII 43)和=
之间的任何字符(ASCII 61)。它类似于:
[A-Z]
所以你必须逃避-
:
r'((<=)|(>=)|[+\-=*/])+'
(或按照评论中的建议将-
放在最后:[+=-]
)
答案 2 :(得分:0)
我能够通过使用否定集来简化这一点:
import re
s = 'H>=ll<=o=wo+rl-d.my name!'
op = 'H >= ll <= o = wo + rl - d.my name!'
s = re.sub(r'([^a-zA-Z0-9.])+',' \\1 ',r'H>=ll<=o=wo+rl-d.myname!')
print (s)
上面提到的其他评论者之所以发生这种情况,是因为 - 并没有像你想要的那样工作。