【问题标题】:Python 2.7 edit a string of charactersPython 2.7 编辑字符串
【发布时间】:2014-03-15 17:59:27
【问题描述】:

我正在试图弄清楚如何从字符串中删除除方括号之外的所有内容

如果用户输入"Hello, my name is [lol] bob [not[really]] john[son]"或输入"[[[[]]][[][][]"

如果用户输入类似于第一条语句的内容,我想删除除括号之外的所有内容。我不想实现输入验证。干杯

编辑:感谢你们的帮助,我爱你们

【问题讨论】:

  • 删除除方括号外的所有内容,因此应该保留方括号吗?还是他们的内容?
  • 很好地编辑了您之前的问题以删除“我也可以...”,并将其作为一个单独的问题提出...尽管我相信您最初想删除所有内容 括号内...

标签: python string python-2.7


【解决方案1】:

你可以使用join():

s = "Hello, my name is [lol] bob [not[really]] john[son]"
s = ''.join(c for c in s if c in '[]')
print s

输出:

[][[]][]

【讨论】:

    【解决方案2】:

    使用lambdafilter- 只是另一种方式,但我觉得它更漂亮。

    >>> your_input = "Hello, my name is [lol] bob [not[really]] john[son]"
    >>> ''.join(filter(lambda x: x in '[]', your_input))
    '[][[]][]'
    

    【讨论】:

    • “Python 3 用户将不得不改用 list(filter()) 代替,如果有人可能正在查看这个答案。”不; str.join 对迭代非常满意。它不需要物化序列。
    • @DSM 你误会我了;它与join() 无关,而是filter() 的输出。在 Python 3 中,如果您没有显式声明 list,则会返回 filter object at <x>,当然不能加入,因为它不是 list- 所以我的回答是完全正确的。
    • 不,我想你误解了str.join。您说“当然不能加入,因为它不是列表”,这是错误的。正如我所说:str.join 对可迭代对象非常满意。自己试试吧。
    • 嗯,这很奇怪。我不知道 filter 对象是可迭代的。谢谢你开导我!
    • 当你计时 lambdafilter 几乎是效率最低的,绝不是最有效的。
    【解决方案3】:

    当对答案有疑问时,值得尝试一些并计时:

    PS C:\python33> .\python.exe lib\timeit.py -s @"
    s = 'Hello, my name is [lol] bob [not[really]]  john[son]'
    "@ @"
    for x in frozenset(s)-frozenset('[]'):
        s = s.replace(x, '')
    "@
    
    1000000 loops, best of 3: 0.844 usec per loop
    
    PS C:\python33> .\python.exe lib\timeit.py -s @"
    s = 'Hello, my name is [lol] bob [not[really]]  john[son]'
    "@ "''.join(c for c in s if c in '[]')"
    
    100000 loops, best of 3: 4.79 usec per loop
    
    PS C:\python33> .\python.exe lib\timeit.py -s @"
    s = 'Hello, my name is [lol] bob [not[really]]  john[son]'
    "@ @"
    s.translate(str.maketrans('','',''.join(set(s)-set('[]'))))
    "@
    
    100000 loops, best of 3: 8.5 usec per loop
    
    PS C:\python33> .\python.exe lib\timeit.py -s @"
    s = 'Hello, my name is [lol] bob [not[really]]  john[son]'
    "@ "''.join(filter(lambda x: x in '[]', s))"
    
    
    100000 loops, best of 3: 9.67 usec per loop
    
    PS C:\python33> .\python.exe lib\timeit.py -s @"
    s = 'Hello, my name is [lol] bob [not[really]]  john[son]'
    import re
    "@ "re.sub('[^][]', '', s)"
    
    100000 loops, best of 3: 15.9 usec per loop
    

    所以@guess 现在删除的答案在要删除的字符集上使用s.replace() 似乎是最快的,而正则表达式替换最慢(但那是 Python 3.3 和我的机器,其他可能会有所不同)。

    另请注意,如果您将上述所有设置字符串替换为:

    s = 'Hello, my name is [lol] bob [not[really]]  john[son]'*1000
    

    那么我得到的时间是:

    10000 loops, best of 3: 190 usec per loop
    100 loops, best of 3: 3.6 msec per loop
    100 loops, best of 3: 4.25 msec per loop
    100 loops, best of 3: 8.72 msec per loop
    100 loops, best of 3: 7.13 msec per loop
    

    所以re.sub 的扩展性比lambda 解决方案更好,但除此之外,其他解决方案保持相同的相对位置。

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2019-02-13
      • 1970-01-01
      • 2018-01-10
      相关资源
      最近更新 更多