Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python2.7编辑字符串_Python_String_Python 2.7 - Fatal编程技术网

Python2.7编辑字符串

Python2.7编辑字符串,python,string,python-2.7,Python,String,Python 2.7,我想知道如何删除字符串中除方括号以外的所有内容 如果用户输入“您好,我的名字是[lol]bob[不是[真的]]john[son]”或输入“[[[]][[[]]” 如果用户输入类似于第一条语句的内容,我想删除除括号以外的所有内容。我不想实现输入验证。干杯 编辑:感谢我爱你的朋友们的帮助您可以使用: 输出: [][[]][] 使用lambda和filter——这只是另一种方法,但我发现它更漂亮 >>> your_input = "Hello, my name is [lol] b

我想知道如何删除字符串中除方括号以外的所有内容

如果用户输入
“您好,我的名字是[lol]bob[不是[真的]]john[son]”
或输入
“[[[]][[[]]”

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

编辑:感谢我爱你的朋友们的帮助您可以使用:

输出:

[][[]][]

使用
lambda
filter
——这只是另一种方法,但我发现它更漂亮

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

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

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
解决方案的缩放效果更好,但其他解决方案保持在相同的相对位置。

删除除方括号外的所有内容,因此除了方括号外,其他内容都不应保留?或者它们的内容也不保留?很好地编辑了前面的问题,删除了“我也可以做什么…”,并将其作为一个单独的问题提出……尽管我相信您最初希望删除括号内的所有内容……”Python 3用户将不得不使用list(filter()),如果有人看到这个答案的话不;
str.join
对iterable非常满意。它不需要具体化的序列。@DSM您误解了我的意思;这不是关于
join()
,而是关于
filter()的输出
。在Python 3中,如果您没有明确声明
列表
,则返回一个位于的
筛选器对象,该对象当然不能加入,因为它不是
列表
——因此我的回答完全正确。不,我认为您误解了
str.join
。您说“当然不能加入,因为它不是列表”,这是错误的。正如我所说:
str.join
对iterable非常满意。你自己试试。哈,这很奇怪。我不知道
过滤器
对象是iterable。谢谢你启发我!当你计时
lambda
过滤器
时,效率几乎是最低的,绝对不是最有效的。
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