Python正则表达式处理点字符

时间:2016-10-04 18:50:10

标签: python regex

在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,如果你能对此有所了解,我将非常感激。

3 个答案:

答案 0 :(得分:7)

点周围空格的原因是-。具体是[+-=],这是一个字符类,其中包含从+=的字符,其中包含.

为避免这种情况,您必须使用-转义\-,例如

re.sub(r'((<=)|(>=)|[+\-=*/])+',' \\1 ',r'H>=ll<=o=wo+rl-d.myname!')

如@LaurentLAPORTE所述,您还可以将-放在字符类的开头或结尾,例如[-+=*/][+=*/-]都可以解决问题。

答案 1 :(得分:4)

所以当你做一个像:

这样的角色类时
[+-=]

正则表达式将其视为+(ASCII 43)和=之间的任何字符(ASCII 61)。它类似于:

[A-Z]

所以你必须逃避-

r'((<=)|(>=)|[+\-=*/])+'

(或按照评论中的建议将-放在最后:[+=-]

Regex101非常便于分析这样的正则表达式模式。您可以看到模式问题here

答案 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)

上面提到的其他评论者之所以发生这种情况,是因为 - 并没有像你想要的那样工作。