在给定模式之前排除字符

时间:2014-12-30 22:53:36

标签: python regex

对于这个问题,我对替代pythonic方法不感兴趣,我只对在我的代码中解决Regex感兴趣。我无法弄清楚它为什么不起作用。

我们说我有以下字符串:

hello.world

我希望得到所有字符,排除点之前的所有字符,除了之前的第一个字符。所以,我试图提取以下子字符串:

o.world

这是我的代码:

re.sub('^.*[^.\..*]', '', string)

我的正则表达式逻辑分解如下,第一个字符^.*不是一个字符后跟一个点后跟任意数量的字符[^.\..*],将被删除。

然而,正则表达式不起作用,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

您当前的代码无效,因为您的模式与您认为的模式不匹配。将.*放入字符集并不意味着"零个或多个字符"。相反,它意味着字符.*。此外,\.被视为\.,而不是转义.(因为.在字符集中没有特殊含义)。

这意味着您的模式实际上等同于:

^.*[^\.*]

匹配:

^       # The start of the string
.*      # Zero or more characters
[^\.*]  # A character that is not \, ., or *

要使用re.sub执行您想要的操作,您可以使用:

>>> import re
>>> re.sub('[^.]*(.\..*)', r'\1', 'hello.world')
'o.world'
>>>

下面解释了模式的作用:

[^.]*  # Matches zero or more characters that are not .
(      # Starts a capture group
.      # Matches any character (save a newline).
\.     # Matches a literal .
.*     # Matches zero or more characters
)      # Closes the capture group

重要的部分是捕获组。在替换字符串中,\1将引用与其匹配的任何内容,在本例中是您要保留的文本。因此,上面的代码可以被视为仅用我们需要的代码替换所有文本。


那就是说,似乎最好只使用re.search

>>> import re
>>> re.search('[^.]*(.\..*)', 'hello.world').group(1)
'o.world'
>>>