例如,我们想要从a
中删除第一个123a45b6a789
之前的所有字符。如何获得45b6a789
的正确结果?
我尝试了re.sub('.*a', '', '123a45b6a789')
,但它给了789
。
谢谢。
首先,使用非贪婪的通配符*?
将防止整个字符串到最后一个a
被吞噬。
但这还不够。此代码将说明问题:
print(re.findall(r'.*?a', '123a45b6a789')) # => ['123', '45b6'] # <-- whoops, matched twice
因此,您可以使用re.sub
的count参数将自己限制为第一场比赛:
re.sub(r'.*?a', '', '123a45b6a789', 1)
# ^^^
或者使用行首锚:
re.sub(r'^.*?a', '', '123a45b6a789')
或者,完全跳过正则表达式并使用constt's solution。
>>> s = '123a45b6a789'
>>> s[s.find('a') + 1:]
'45b6a789'
那么有很多不同的方法来给猫皮肤。但您可以执行以下操作:
def removeCharBeforeKey(string, key):
return key.join(string.split(key)[1:]))
其中key是关键字(a
)。在这个例子中,字符串是你的输入(123a45b6a789
)。
这就是说在关键字上拆分字符串,然后在第一个之后重新加入。你也可以find
索引,只是比第一个索引多一个。
使用非贪婪的?
re.sub('.*?a', '', '123a45b6a789')` but it gives `789`
我建议在regex webapps上试用正则表达式以帮助揭开神秘面纱。只是谷歌正则表达式,你会找到一个。
正如Chan所说:“我们想在第一个字符之前删除所有字符”,换句话说,我们需要删除所有不是'a'的字符从开始到'a',所以我们应该删除第一个非字符串和第一个,^[^a]*a
。
import re
print re.sub("^[^a]*a", u"", u"123a45b6a789") # output: 45b6a789
print re.sub("^[^a]*", u"", u"123a45b6a789") # output: a45b6a789
我只是测试Python2.7 linux 16.04
中某些方法的成本时间,我的方法更快,如下:
%timeit _ = re.sub("^[^a]*a", u"", '24579999999999999999999999999999999999999999999999999999999999999912734162854614678567ijkljklhhjkja45b6a789')
#1000000 loops, best of 3: 1.29 µs per loop
%timeit _ = re.sub('^.*?a', '', '24579999999999999999999999999999999999999999999999999999999999999912734162854614678567ijkljklhhjkja45b6a789')
# 1000000 loops, best of 3: 1.93 µs per loop