首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
宝塔
V2EX  ›  Python

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

  •  
  •   miniyao · 59 天前 · 1684 次点击
    这是一个创建于 59 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    19 回复  |  直到 2019-09-20 00:48:53 +08:00
        1
    crayygy   59 天前 via iPhone   ♥ 1
    用正则,加上行开头就行了
        2
    andyholo   59 天前 via Android
    bar 在哪?
        3
    lishunan246   59 天前   ♥ 1
    ^(FOO )*(.*)$
        4
    Trim21   59 天前 via Android   ♥ 1
    不喜欢用正则的话
    while s.startswith ():s=s.replace (,,1 )
        6
    miniyao   59 天前
    @crayygy
    @lishunan246
    @Trim21
    @sunwei0325
    感谢几位的建议,匹配上了。

    从性能上讲,#3 楼 #4 楼 哪个性能会更好些?
        7
    crayygy   59 天前
    @miniyao #6 随便 for 循环个十万次算下时间看下呗
        8
    Trim21   59 天前 via Android
    @miniyao 你实际跑一下试试呗…
        9
    Trim21   59 天前 via Android   ♥ 1
    @Trim21 不过盲猜一个正则效率高
        10
    miniyao   59 天前
    @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 ?
        11
    noqwerty   59 天前 via Android   ♥ 1
    @miniyao 去掉外面的[],你现在匹配的是 [, F, O, ] 和 \s 这些字符
        13
    jinliming2   59 天前 via iPhone   ♥ 1
    @miniyao ^(\[FOO\]\s*|FOO\s*)+
        14
    miniyao   59 天前
        15
    lululau   59 天前
    update t set c = regex_substr(c, regex, substitution)
        16
    ysc3839   59 天前 via Android
    @Trim21
    @miniyao 四楼的会好一点,但是不需要 replace,既然都 startswith 了,直接 slice 去掉开头那段就好了,replace 还会多一次比较。
        17
    noqwerty   59 天前
    @miniyao #14 另外你这种情况直接 s.lstrip("[FOO]") 就可以吧
        18
    miniyao   59 天前
    @noqwerty 试过的,里面的 [FOO] 个数不确定,[FOO] 后面可能还有空格,lstrip 可以剥,但搞不干净。
        19
    qwertyegg   59 天前
    先 replace("FOO", ""),然后 trim()
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4219 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 03:07 · PVG 11:07 · LAX 19:07 · JFK 22:07
    ♥ Do have faith in what you're doing.