V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
miniyao
V2EX  ›  Python

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

  •  
  •   miniyao · 2019-09-19 19:59:23 +08:00 · 3572 次点击
    这是一个创建于 1898 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    19 条回复    2019-09-20 00:48:53 +08:00
    crayygy
        1
    crayygy  
       2019-09-19 20:02:25 +08:00 via iPhone   ❤️ 1
    用正则,加上行开头就行了
    andyholo
        2
    andyholo  
       2019-09-19 20:05:47 +08:00 via Android
    bar 在哪?
    lishunan246
        3
    lishunan246  
       2019-09-19 20:10:44 +08:00   ❤️ 1
    ^(FOO )*(.*)$
    Trim21
        4
    Trim21  
       2019-09-19 20:19:06 +08:00 via Android   ❤️ 1
    不喜欢用正则的话
    while s.startswith ():s=s.replace (,,1 )
    sunwei0325
        5
    sunwei0325  
       2019-09-19 20:36:57 +08:00   ❤️ 1
    miniyao
        6
    miniyao  
    OP
       2019-09-19 20:45:42 +08:00
    @crayygy
    @lishunan246
    @Trim21
    @sunwei0325
    感谢几位的建议,匹配上了。

    从性能上讲,#3 楼 #4 楼 哪个性能会更好些?
    crayygy
        7
    crayygy  
       2019-09-19 20:48:49 +08:00
    @miniyao #6 随便 for 循环个十万次算下时间看下呗
    Trim21
        8
    Trim21  
       2019-09-19 20:50:41 +08:00 via Android
    @miniyao 你实际跑一下试试呗…
    Trim21
        9
    Trim21  
       2019-09-19 20:52:32 +08:00 via Android   ❤️ 1
    @Trim21 不过盲猜一个正则效率高
    miniyao
        10
    miniyao  
    OP
       2019-09-19 21:11:50 +08:00
    @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
        11
    noqwerty  
       2019-09-19 21:17:57 +08:00 via Android   ❤️ 1
    @miniyao 去掉外面的[],你现在匹配的是 [, F, O, ] 和 \s 这些字符
    sunwei0325
        12
    sunwei0325  
       2019-09-19 21:18:58 +08:00   ❤️ 1
    jinliming2
        13
    jinliming2  
       2019-09-19 21:20:03 +08:00 via iPhone   ❤️ 1
    @miniyao ^(\[FOO\]\s*|FOO\s*)+
    miniyao
        14
    miniyao  
    OP
       2019-09-19 21:30:54 +08:00
    lululau
        15
    lululau  
       2019-09-19 21:50:39 +08:00
    update t set c = regex_substr(c, regex, substitution)
    ysc3839
        16
    ysc3839  
       2019-09-19 22:05:59 +08:00 via Android
    @Trim21
    @miniyao 四楼的会好一点,但是不需要 replace,既然都 startswith 了,直接 slice 去掉开头那段就好了,replace 还会多一次比较。
    noqwerty
        17
    noqwerty  
       2019-09-19 22:07:34 +08:00
    @miniyao #14 另外你这种情况直接 s.lstrip("[FOO]") 就可以吧
    miniyao
        18
    miniyao  
    OP
       2019-09-19 22:16:27 +08:00
    @noqwerty 试过的,里面的 [FOO] 个数不确定,[FOO] 后面可能还有空格,lstrip 可以剥,但搞不干净。
    qwertyegg
        19
    qwertyegg  
       2019-09-20 00:48:53 +08:00
    先 replace("FOO", ""),然后 trim()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1442 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:23 · PVG 01:23 · LAX 09:23 · JFK 12:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.