python正则表达式用逗号或空格分割(但保留字符串)

时间:2015-06-26 20:33:41

标签: python regex string

我需要按空格或逗号分割字符串。但它应该保留单引号或双引号字符串。即使它被许多空间或单个空间分开也没有区别。例如:

    """ 1,' unchanged 1' " unchanged  2 "   2.009,-2e15 """

应该返回

    """ 1,' unchanged 1'," unchanged  2 ",2.009,-2e15 """

逗号前后可能没有或多个空格。那些空间应该被忽略。在这个特定的上下文中,如ex字符串所示,如果两个带引号或双引号的字符串碰巧彼此相邻,则它们之间将有一个空格或逗号。

我在python reg ex to include missing commas有一个上一个问题,但是,为了工作,分裂的逗号应该有一个空格。

1 个答案:

答案 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秒。

相关问题