如何删除python中首次出现关键字的字符串?

问题描述 投票:1回答:5

例如,我们想要从a中删除第一个123a45b6a789之前的所有字符。如何获得45b6a789的正确结果?

我尝试了re.sub('.*a', '', '123a45b6a789'),但它给了789

谢谢。

python regex
5个回答
2
投票

首先,使用非贪婪的通配符*?将防止整个字符串到最后一个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


1
投票
>>> s = '123a45b6a789'
>>> s[s.find('a') + 1:]
'45b6a789'

0
投票

那么有很多不同的方法来给猫皮肤。但您可以执行以下操作:

def removeCharBeforeKey(string, key):
    return key.join(string.split(key)[1:]))

其中key是关键字(a)。在这个例子中,字符串是你的输入(123a45b6a789)。

这就是说在关键字上拆分字符串,然后在第一个之后重新加入。你也可以find索引,只是比第一个索引多一个。


0
投票

使用非贪婪的?

re.sub('.*?a', '', '123a45b6a789')` but it gives `789`

我建议在regex webapps上试用正则表达式以帮助揭开神秘面纱。只是谷歌正则表达式,你会找到一个。


0
投票

正如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
© www.soinside.com 2019 - 2024. All rights reserved.