对于这个问题,我对替代pythonic方法不感兴趣,我只对在我的代码中解决Regex感兴趣。我无法弄清楚它为什么不起作用。
我们说我有以下字符串:
hello.world
我希望得到所有字符,排除点之前的所有字符,除了之前的第一个字符。所以,我试图提取以下子字符串:
o.world
这是我的代码:
re.sub('^.*[^.\..*]', '', string)
我的正则表达式逻辑分解如下,第一个字符^.*
不是一个字符后跟一个点后跟任意数量的字符[^.\..*]
,将被删除。
然而,正则表达式不起作用,有人可以帮助我吗?
答案 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'
>>>