字符串开头有 n 个特殊标志 FOO ,怎样简单快速的把 FOO 全部去除?

2019 年 9 月 19 日
 miniyao

由于历史原因,导致数据库里一些字符串前面被错误的添加了 n 个 FOO 标志,可能的情况如下:

FOO 尊敬的张先生,
FOO FOO 您好!
FOO FOO FOO ... 已经收到您的信件

每一个字符串开头,都有可能出现 n 个 FOO (也可能没有),怎么简单的处理,把字符串开头的 FOO 全部去除? (没有用 replace 和正则 re.sub()的原因,是字符中间部分的 FOO 不能去除)

4178 次点击
所在节点    Python
19 条回复
crayygy
2019 年 9 月 19 日
用正则,加上行开头就行了
andyholo
2019 年 9 月 19 日
bar 在哪?
lishunan246
2019 年 9 月 19 日
^(FOO )*(.*)$
Trim21
2019 年 9 月 19 日
不喜欢用正则的话
while s.startswith ():s=s.replace (,,1 )
sunwei0325
2019 年 9 月 19 日
miniyao
2019 年 9 月 19 日
@crayygy
@lishunan246
@Trim21
@sunwei0325
感谢几位的建议,匹配上了。

从性能上讲,#3 楼 #4 楼 哪个性能会更好些?
crayygy
2019 年 9 月 19 日
@miniyao #6 随便 for 循环个十万次算下时间看下呗
Trim21
2019 年 9 月 19 日
@miniyao 你实际跑一下试试呗…
Trim21
2019 年 9 月 19 日
@Trim21 不过盲猜一个正则效率高
miniyao
2019 年 9 月 19 日
@crayygy
@lishunan246
@Trim21
@sunwei0325

跑出来一个非常诡异的情况:

>>> s = '[FOO][FOO][FOO]KO'
>>> re.sub(r'^([\[FOO\]\s])*', '', s)
'KO'

>>> s = '[FOO][FOO][FOO]OK'
>>> re.sub(r'^([\[FOO\]\s])*', '', s)
'K'

KO 和 OK 匹配出来的结果,KO 剩下了 ‘KO’,OK 怎么吧 O 给丢了,只有 K ?
noqwerty
2019 年 9 月 19 日
@miniyao 去掉外面的[],你现在匹配的是 [, F, O, ] 和 \s 这些字符
sunwei0325
2019 年 9 月 19 日
jinliming2
2019 年 9 月 19 日
@miniyao ^(\[FOO\]\s*|FOO\s*)+
miniyao
2019 年 9 月 19 日
lululau
2019 年 9 月 19 日
update t set c = regex_substr(c, regex, substitution)
ysc3839
2019 年 9 月 19 日
@Trim21
@miniyao 四楼的会好一点,但是不需要 replace,既然都 startswith 了,直接 slice 去掉开头那段就好了,replace 还会多一次比较。
noqwerty
2019 年 9 月 19 日
@miniyao #14 另外你这种情况直接 s.lstrip("[FOO]") 就可以吧
miniyao
2019 年 9 月 19 日
@noqwerty 试过的,里面的 [FOO] 个数不确定,[FOO] 后面可能还有空格,lstrip 可以剥,但搞不干净。
qwertyegg
2019 年 9 月 20 日
先 replace("FOO", ""),然后 trim()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/602286

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX