字符串和文本处理技巧

复杂文本分隔:

  你需要将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的。

解决办法:

1 >>> line = 'asdf fjdk; afed, fjek,asdf, foo'
2 >>> import re
3 >>> re.split(r'[;,\s]\s*', line)
4 ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']

Note:

  当你使用 re.split() 函数时候,需要特别注意的是正则表达式中是否包含一个括号捕获分组。 如果使用了捕获分组,那么被匹配的文本也将出现在结果列表中。比如,观察一下这段代码运行后的结果:

1 >>> fields = re.split(r'(;|,|\s)\s*', line)
2 >>> fields
3 ['asdf', ' ', 'fjdk', ';', 'afed', ',', 'fjek', ',', 'asdf', ',', 'foo']
4 >>>

获取分割字符在某些情况下也是有用的。 比如,你可能想保留分割字符串,用来在后面重新构造一个新的输出字符串:

 1 >>> values = fields[::2]
 2 >>> delimiters = fields[1::2] + ['']
 3 >>> values
 4 ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
 5 >>> delimiters
 6 [' ', ';', ',', ',', ',', '']
 7 >>> # Reform the line using the same delimiters
 8 >>> ''.join(v+d for v,d in zip(values, delimiters))
 9 'asdf fjdk;afed,fjek,asdf,foo'
10 >>>

如果你不想保留分割字符串到结果列表中去,但仍然需要使用到括号来分组正则表达式的话, 确保你的分组是非捕获分组,形如 (?:...) 。比如:

1 >>> re.split(r'(?:,|;|\s)\s*', line)
2 ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
3 >>>

 

 

 

  

posted @ 2018-01-05 10:20  在路上-UP  阅读(302)  评论(0编辑  收藏  举报