我需要按空格或逗号分割字符串。但它应该保留单引号或双引号字符串。即使它被许多空间或单个空间分开也没有区别。例如:
""" 1,' unchanged 1' " unchanged 2 " 2.009,-2e15 """
应该返回
""" 1,' unchanged 1'," unchanged 2 ",2.009,-2e15 """
逗号前后可能没有或多个空格。那些空间应该被忽略。在这个特定的上下文中,如ex字符串所示,如果两个带引号或双引号的字符串碰巧彼此相邻,则它们之间将有一个空格或逗号。
我在python reg ex to include missing commas有一个上一个问题,但是,为了工作,分裂的逗号应该有一个空格。
答案 0 :(得分:1)
编辑:以前的版本破坏了我认为会在文件中的换行符。现在修好了。
对于“如果有疑问,使用蛮力”这一方面可能太过分了,但works:
regex = r"""(?<=["'])[^\S\n]+(?=["'])|(?<=["'])[^\S\n]+(?=\d)|(?<=\d)[^\S\n]+(?=\d|\.\d)|(?<=(?<=\w|\d)\d)[^\S\n]+(?=["'])|(?<=["'\d])[^\S\n]*,[^\S\n]*"""
它在字符串中留下逗号,并用前导点处理数字。
获得所需的输出:
re.sub(regex, ",", original_string)
关于性能的粗略概念[1],在Ivy Bridge Celeron上
import timeit
s = """\
import re
s = \"\"\"1,' unchanged 1' " unchanged 2 " 2.009,-2e15 35 " fad!" ' dfgsdfg ' , 'asdfasdf' " fasf , , asfa" "2 fs", .085 .835\"\"\"
rgex = re.compile(r\"\"\"(?<=["'])\s+(?=["'])|(?<=["'])\s+(?=\d)|(?<=\d)\s+(?=\d|\.\d)|(?<=(?<=\w|\d)\d)\s+(?=["'])|(?<=["'\d])\s*,\s*\"\"\")
re.sub(rgex, ",", s)
"""
print("1k iterations: ", timeit.timeit(stmt=s, number=1000))
print("10k iterations: ", timeit.timeit(stmt=s, number=10000))
print("100k iterations: ", timeit.timeit(stmt=s, number=100000))
print("200k iterations: ", timeit.timeit(stmt=s, number=200000))
print("300k iterations: ", timeit.timeit(stmt=s, number=300000))
给出:
1k iterations: 0.0494868220000626
10k iterations: 0.4617418729999372
100k iterations: 4.604098313999884
200k iterations: 9.197777003000056
300k iterations: 13.79744054799994.
有趣的是,对于regex
模块,它应该是更高效的(据我所知),并且应该在未来的某个时间替换标准库re
,它是大约慢两倍。
[1]:这不是一个真实的测试,因为它只是反复遍历字符串,但我很着急。后来试了一点,用200.000和300.000行(相同的字符串)组成的字符串,它大致相同。 200.000秒~8秒,300.000秒~12秒。